我在使用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进行编译...因为我绝对感到困惑。
最佳答案
如果您针对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?以获取避免的可能解决方案
生成任意范围的随机数时溢出。
关于ios - 从UInt32转换为Int时溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32075019/