这个objective-c代码在swift中的等效代码是什么?

5
这段代码在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 ;
}

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


1
你应该发布你尝试过的内容。 - Avt
在Swift中,可以通过@inline来获取内联函数,并且可以使用UInt16.max。 - Adnan Aftab
如果你想要 INT16_MAX 的等效值,显然应该使用 Int16.max。 - gnasher729
3个回答

0

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

0

这应该可以完成工作

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

1
@Avt 这个答案修复了你的答案中出现的编译错误。arc4random_uniform 的返回值是 UInt32,而不是 CGFloat - Mick MacCallum
@Avt:你将一个UInt16作为参数传递给了arc4random_uniform。你的代码没有起作用。然后你编辑了你的问题。 - Luca Angeletti

0

尝试将其作为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秒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接