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

前端之家收集整理的这篇文章主要介绍了swift – 为什么以下代码在iPhone 5上崩溃而在iPhone 5S上崩溃?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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,它为您处理模数并避免当前实现中固有的偏差.

猜你在找的Swift相关文章