从UInt32转换为Int时溢出

时间:2015-08-18 14:18:27

标签: ios swift swift2

我对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.maxUInt32.max的值不合适。

如果有任何帮助,我可以使用Xcode 7.0 beta 5进行编译......因为我绝对难以接受。

1 个答案:

答案 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?以了解可能的解决方案 在为任意范围生成随机数时溢出。