我在最近的一个 swift 程序中遇到了这个奇怪的错误。它涉及随机事件,为了模拟这一点,我分配了一个事件“赔率”,然后生成两个随机数(使用这些赔率),如果数字相同,则 Action 发生。但是程序在生成部分莫名其妙地崩溃了。我能想到的唯一解释是所需的转换过多,但我不确定为什么它只是偶尔崩溃一次。我将不胜感激关于为什么类型转换崩溃的任何见解以及关于如何避免这种过度类型转换的任何建议。
我的图片显示了代码和错误,下面的代码是我的代码的概括。
Crash Error
let rand = [Int(arc4random_uniform(UInt32(someInt))), Int(arc4random_uniform(UInt32(someInt)))]
if (rand[0] == rand[1]) {
executeAction()
}
最佳答案
发生这种情况是因为您的整数变量 shootOdds
在某些时候取负值(或者:不太合理,值大于 4,294,967,295
),导致运行时错误转换为无符号整数,UInt32(someInt)
。您可以通过确保在 let rand = ...
行之前 shootOdds >= 0
(或者在上面的代码示例中,someInt >= 0
),或者您的数字不大于 UInt32
的上限。
因此请注意,错误与 rand 函数无关,但特别是负整数转换为无符号整数。
例如,在您的 playground 中尝试以下示例,以断言您遇到相同的运行时错误:
let a = -1
let b = UInt32(a)
关于Swift 转换导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34458997/