Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios swift中此objective-c代码的等效项是什么?_Ios_Objective C_Swift - Fatal编程技术网

Ios swift中此objective-c代码的等效项是什么?

Ios swift中此objective-c代码的等效项是什么?,ios,objective-c,swift,Ios,Objective C,Swift,该代码的swift替代代码是什么 static inline CGFloat randomInRangeScale(CGFloat scale) { CGFloat value = arc4random_uniform(INT16_MAX); return value * 0.000015 + 0.8 ; } 我试过这个: func randomInRangeScale(scale : CGFloat) -> CGFloat { let value : CGFlo

该代码的swift替代代码是什么

static inline CGFloat randomInRangeScale(CGFloat scale)
{
    CGFloat value = arc4random_uniform(INT16_MAX);
    return value * 0.000015 + 0.8 ;
}
我试过这个:

func randomInRangeScale(scale : CGFloat) -> CGFloat
{
    let value : CGFloat = arc4random_uniform(UInt16);
    return value * 0.000015 + 0.8 ;
}

但是它给了我一个错误,
“不能用类型为“((UInt16).type)”的参数列表调用'arc4random_uniform'”

arc4random_uniform
的参数类型是
UInt32
,因此您必须将
UInt16_MAX
强制转换为
UInt32
,并将值强制转换为
CGFloat

试试这个:

func randomInRangeScale(scale : CGFloat) -> CGFloat {
    let value = arc4random_uniform(UInt32(UINT16_MAX));
    return CGFloat(value) * 0.000015 + 0.8;
}
这应该可以完成任务

func randomInRangeScale(scale : CGFloat) -> CGFloat {
    let random = arc4random_uniform(UInt32(UInt16.max))
    let randomCGFloat = CGFloat(random)
    return randomCGFloat * 0.000015 + 0.8
}

尝试将其作为CGFloat上的扩展,如-

extension CGFloat {
static func randomFloat() -> CGFloat {
    return CGFloat(arc4random_uniform(UInt32(UInt16.max))) * 0.000015 + 0.8
     }
}
并称之为使用-

CGFloat.randomFloat()
在主线程上运行一些涉及在循环中调用它1亿次的测试之后,它似乎比将相同的函数作为方法实现要快

这是测试-

let loopIterationCount = 100000000
    var timestamp = NSDate()
    for var k = 0 ; k < loopIterationCount ; k++ {
        let x = CGFloat.randomFloat()
    }
    var timeStampEnd = NSDate()
    println("CGFloat extension took \(self.timeDifference(timestamp, endTime: timeStampEnd)) seconds.")

    timestamp = NSDate()
    for var k = 0 ; k < loopIterationCount ; k++ {
        let x = self.randomFloat()
    }
    timeStampEnd = NSDate()
    println("function took \(self.timeDifference(timestamp, endTime: timeStampEnd)) seconds.")

func randomFloat() -> CGFloat {
    return CGFloat(arc4random_uniform(UInt32(UInt16.max))) * 0.000015 + 0.8
}

func timeDifference(startTime: NSDate, endTime: NSDate) -> NSTimeInterval {
    return endTime.timeIntervalSinceDate(startTime)
}
让loopIterationCount=100000000
var timestamp=NSDate()
对于var k=0;kCGFloat{
返回CGFloat(arc4random_uniform(UInt32(UInt16.max))*0.000015+0.8
}
func时差(开始时间:NSDate,结束时间:NSDate)->NSTIMEIVAL{
返回endTime.timeIntervalSinceDate(startTime)
}
结果

CGFloat扩展耗时3.19389200210571秒

函数运行了5.254909221802秒


您应该发布您尝试过的内容。swift中的inline将类似于@inline,如果您想要Int16\u max的等效值,则可以使用UInt16.MAX16.MAX16.max。@Avt此答案修复了您答案中的编译错误。
arc4random_uniform
的返回值是
UInt32
,而不是
CGFloat
@Avt:您将
UInt16
作为参数传递给
arc4random_uniform
。你的代码不起作用。然后你编辑了你的问题。