我对Swift / Xcode有一个非常奇怪的问题(说实话,不确定来源在哪里)。
我必须遵循以下代码:
extension Int {
func random(min : Int = 0, max : Int = Int(UInt32.max - 1)) {
return min + Int(arc4random_uniform(UInt32(max - min + 1)))
}
}
当我在Xcode中构建此代码时,它完全正常。当我尝试使用xcodebuild
构建它时,编译器给出了以下错误:
integer overflows when converted from 'UInt32' to 'Int'
public static func random(min : Int = 0, max : Int = Int(UInt32.max - 1)) -> Int {
这很奇怪,因为Int.max
和UInt32.max
的值不合适。
如果有任何帮助,我可以使用Xcode 7.0 beta 5进行编译......因为我绝对难以接受。
答案 0 :(得分:3)
如果您为32位设备(例如iPhone 5)进行编译,则会发生此错误,
因为Int
是签名的 32位整数,UInt32.max - 1
超出其范围。
另一个问题是UInt32(max - min + 1)
的计算,
由于溢出,它可能在运行时崩溃,例如如果你打电话
random(min : Int.min, max : Int.max)
请参阅How can I generate large, ranged random numbers in Swift?以了解可能的解决方案 在为任意范围生成随机数时溢出。