【问题标题】:Swift casting causes the app to crashSwift Casting 导致应用程序崩溃
【发布时间】:2015-12-25 00:09:43
【问题描述】:

在我最近的一个 swift 程序中,我遇到了这个奇怪的错误。它涉及随机事件,为了模拟这一点,我分配了一个事件“赔率”,然后生成两个随机数(使用这些赔率),如果数字相同,则动作发生。但是程序在生成部分莫名其妙地崩溃了。我能想到的唯一解释是需要过多的投射,但我不确定为什么它只会偶尔崩溃一次。我很感激任何关于为什么铸造崩溃的见解以及任何关于如何避免这种过度铸造的建议。
我的图片显示了代码和错误,下面的代码是我的代码的概括。 Crash Error

let rand = [Int(arc4random_uniform(UInt32(someInt))), Int(arc4random_uniform(UInt32(someInt)))]
if (rand[0] == rand[1]) {
    executeAction()
}

【问题讨论】:

  • 为了澄清,arc4random_uniform 采用 UInt32 并返回 UInt32。我的 someInt 是个位整数。
  • 这对我来说没有崩溃, someInt 包含什么?
  • 显然是呈指数增长的数字。在某些情况下,我将赔率翻了一番(从 3 到 6)……但由于赔率是全球性的,所以他们保留了增加并继续翻倍。我猜 UInt32 已用尽并抛出错误。不过感谢您的帮助!

标签: swift casting crash


【解决方案1】:

发生这种情况是因为您的整数变量 shootOdds 在某些时候取负值(或:不太合理,大于 4,294,967,295 的值),导致转换为无符号整数 UInt32(someInt) 时出现运行时错误。您可以通过在 let rand = ... 行之前确保 shootOdds >= 0(或在上面的代码示例中为 someInt >= 0)或您的编号不大于 UInt32 的上限来避免这种情况。

因此请注意,该错误与 rand 函数无关,而是与将负整数强制转换为无符号整数有关。

例如,在您的 Playground 中尝试以下示例,以断言您会遇到相同的运行时错误:

let a = -1
let b = UInt32(a)

【讨论】:

  • 感谢您的帮助!事实证明,这个数字太大了,而不是负数。我有一些错误的代码,它以指数方式增加几率,直到它们大于 32 位。
  • 嘿,我猜想考虑太大,但认为负面更合理。我将编辑答案以使其详尽无遗。
  • 游乐场的想法真的很好,我应该一开始就搞砸了。使用它,我认为在 20 到 25 次翻倍的迭代中 UInt32 会崩溃。这就解释了为什么它只会在一段时间后发生。
  • 是的,游乐场对学习很有帮助。祝你飞快好运,当事情没有意义的时候记得去操场!
【解决方案2】:

由于代码错误,我的几率呈指数级增长,最终太大而无法包含在 UInt32 中......因此出现了错误。感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2016-06-04
    • 2011-08-24
    • 2014-05-03
    相关资源
    最近更新 更多