在swift中,这段objective-c代码的等价物是什么?



这段代码的备选代码是什么?

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 ;
}

但是它给了我一个错误"Cannot invoke 'arc4random_uniform' with an argument list of type '((UInt16).Type)"

应该可以了

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

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;
}

尝试将其作为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)
}

结果

CGFloat扩展耗时3.19389200210571秒。

函数耗时5.25490999221802秒。

最新更新