func rand(max: Int?) -> Int { var index = Int(arc4random()) return max? != nil ? (index % max!) : index }
我在最后一行得到一个例外:EXC_BAD_INSTRUCTION
我猜这与iPhone 5S是64位同时5不是这样的事实有关,但我在上面的函数中没有看到任何处理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,它在iPhone 5上具有两倍于Int的正范围,因此你的第一个版本基本上有50%的机会在这一行崩溃:
var index = Int(arc4random())
您的修改版本等待转换,直到您使用max的模数和,因此在那里转换为Int是安全的.您应该查看arc4random_uniform,它为您处理模数并避免当前实现中固有的偏差.