func rand(max: Int?) -> Int { var index = Int(arc4random()) return max? != nil ? (index % max!) : index }
我在最后一行遇到异常: EXC_BAD_INSTRUCTION
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) }
的Int整数类型是在iPhone 5 32位整数,在一个5S 64位整数。由于arc4random()返回的UInt32值是IntiPhone 5 的正范围的两倍,因此您的第一个版本基本上有50%的机率在此行崩溃:
Int
arc4random()
UInt32
var index = Int(arc4random())
修改后的版本将等待转换,直到您使用取模和为止max,因此可以安全地转换到Int那里。您应该检出arc4random_uniform,它为您处理模并避免当前实现中固有的偏差。
max