Swift 转换导致应用程序崩溃

标签 swift casting crash

我在最近的一个 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/

相关文章:

Java 类型转换和变量类型赋值

swift - 在 Swift 中重铸时,何时使用 "<object> as <type>"以及何时使用 <type>(<object>)

ios - 如何处理 iOS Swift 中的 CoreData 崩溃?

iOS 应用程序崩溃 - NSURLConnection+MPIntercept.m

ios - 在 UILabel 上显示 iPhone 剪切复制粘贴菜单

ios - 如何设置状态栏或安全区域以去除 iPhone X 上的空白?

ios - 添加代码以注册用户通知设置时出现错误结果

ios - 使用 Mapbox 更改 map 上的注释图像

c - 将 char 类型转换为结构体是如何工作的

ios - 一次非常奇怪的车祸。我如何解决它?