Swift 转换导致应用程序崩溃
Swift casting causes the app to crash
我在最近的 swift 程序中遇到了这个奇怪的错误。它涉及随机事件,为了模拟这一点,我分配了一个事件 'odds,',然后生成两个随机数(使用这些几率),如果数字相同,则动作发生。但是程序在生成部分莫名其妙地崩溃了。我能想到的唯一解释是所需的转换过多,但我不确定为什么它只是偶尔崩溃一次。我将不胜感激关于为什么铸造崩溃的任何见解以及关于如何避免这种过度铸造的任何建议。
我的图片显示了代码和错误,下面的代码是我代码的概括。
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)
由于代码错误,我的几率呈指数增长,最终太大而无法包含在 UInt32 中...因此出现错误。感谢您的帮助!
我在最近的 swift 程序中遇到了这个奇怪的错误。它涉及随机事件,为了模拟这一点,我分配了一个事件 'odds,',然后生成两个随机数(使用这些几率),如果数字相同,则动作发生。但是程序在生成部分莫名其妙地崩溃了。我能想到的唯一解释是所需的转换过多,但我不确定为什么它只是偶尔崩溃一次。我将不胜感激关于为什么铸造崩溃的任何见解以及关于如何避免这种过度铸造的任何建议。
我的图片显示了代码和错误,下面的代码是我代码的概括。
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)
由于代码错误,我的几率呈指数增长,最终太大而无法包含在 UInt32 中...因此出现错误。感谢您的帮助!