一尘不染

为什么以下代码在iPhone 5而不是iPhone 5S上崩溃?

swift

func rand(max: Int?) -> Int {
    var index = Int(arc4random())
    return max? != nil ? (index % max!) : index
}

我在最后一行遇到异常: EXC_BAD_INSTRUCTION

我猜这与iPhone 5S是64位而iPhone 5S不是64位有关,但是我在上面的函数中看不到任何处理64位的东西吗?

编辑

通过以下调整,我可以解决此问题,但是我仍然无法解释原因。

func rand(max: Int?) -> Int {
    var index = arc4random()
    return max? != nil ? Int(index % UInt32(max!)) : Int(index)
}

阅读 285

收藏
2020-07-07

共1个答案

一尘不染

Int整数类型是在iPhone 5 32位整数,在一个5S
64位整数。由于arc4random()返回的UInt32值是IntiPhone 5
的正范围的两倍,因此您的第一个版本基本上有50%的机率在此行崩溃:

var index = Int(arc4random())

修改后的版本将等待转换,直到您使用取模和为止max,因此可以安全地转换到Int那里。您应该检出arc4random_uniform,它为您处理模并避免当前实现中固有的偏差。

2020-07-07