一尘不染

将arc4random()的结果强制转换为Int时崩溃

swift

我写了一个简单的Bag类。袋子中装有固定比例的温度枚举。它使您可以随机抓取一个,并在装满后自动自动装满。看起来像这样:

class Bag {
    var items = Temperature[]()

    init () {
        refill()
    }

    func grab()-> Temperature {
        if items.isEmpty {
            refill()
        }

        var i = Int(arc4random()) % items.count
        return items.removeAtIndex(i)
    }

    func refill() {
        items.append(.Normal)

        items.append(.Hot)
        items.append(.Hot)

        items.append(.Cold)
        items.append(.Cold)
    }
}

温度枚举看起来像这样:

enum Temperature: Int {
    case Normal, Hot, Cold
}

GameScene:SKScene有一个常量实例属性bag:Bag。(我也尝试过使用变量。)当我需要一个新的温度时,调用bag.grab()一次didMoveToView,在合适的时候调用touchesEnded

此呼叫随机地在中的if items.isEmpty行崩溃Bag.grab()。错误是EXC_BAD_INSTRUCTION。检查调试器是否显示项目is
size=1[0] = (AppName.Temperature) <invalid> (0x10)

编辑 好像我不了解调试器信息。即使有效的数组也会显示size=1和无关的值[0] =。所以没有帮助。

我无法让它在操场上崩溃。这可能很明显,但我很困惑。


阅读 326

收藏
2020-07-07

共1个答案

一尘不染

函数arc4random返回UInt32。如果获得的值大于Int.max,则转换Int(...)将崩溃。

使用

Int(arc4random_uniform(UInt32(items.count)))

应该是一个更好的解决方案。

(责怪Alpha版本中奇怪的崩溃消息…)

2020-07-07