当前位置: 首页 > 面试题库 >

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

霍浩皛
2023-03-14
问题内容

我写了一个简单的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] =。所以没有帮助。

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


问题答案:

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

使用

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

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

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



 类似资料:
  • 问题内容: 我试图将浮点数转换为php中的int值: 我可以使用ceil使其工作,但是有人可以向我解释吗? 问题答案: 这是因为以10为底的有限表示形式的数字在PHP使用的浮点表示形式中可能具有也可能没有确切的表示形式。 看到 由于总是将数字四舍五入,因此制图表达中的一个小错误使它可以将其四舍五入为一个原本希望的数字。 考虑改为使用。

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 给定如下所示的数据帧 您可能会注意到,这里所有的列都已转换为类型。是否有办法将某些列转换为? 尝试了以下方法 这会引发错误 阅读有关可为空的整数数据类型的信息,然后重试 这会引发错误

  • 问题内容: 我正在学习本教程:如何使用Android Keystore存储密码和其他敏感信息 。它(宽松地)与Google示例应用程序BasicAndroidKeyStore绑定在一起。 我可以使用公钥加密数据,也可以在运行Lollipop的设备上解密。但是我有一个运行棉花糖的Nexus 6,它崩溃了,并显示错误消息: 这是它崩溃的代码: 我不愿意将此归结为Android M怪异之处,因为我认为没

  • 问题内容: 我正在尝试将数据从Java客户端发送到ac#服务器,并且在将int转换为字节数组时遇到麻烦。 当我使用此代码使用C#转换数字8342时: 结果是:x [4] = {150,32,0,0} 与Java我使用: 结果是:x [4] = {0,0,32,-106} 有人可以解释吗?我是Java新手,这是我第一次在字节数组中看到负数。 问题答案: 您必须更改字节序: Java在内部将事物存储为

  • 问题内容: 我的存储过程: 在我的C#代码中 有人可以告诉我我做错了什么吗?谢谢你。 问题答案: 我的猜测是,该值将以而不是装箱返回。取消装箱时,类型必须 完全 正确。因此,假设我是对的,但事实并非如此,您可以使用: 它会工作。不过,这很丑陋。如果真正使用单精度值, 则 使用它应该正确,而且(IMO)情况更清楚。 __ 另一方面,您的数据 实际上 可能以的形式从数据库中返回,在这种情况下,您应该(