【问题标题】:Crash with reading Int32 with Swift 2 and core data使用 Swift 2 和核心数据读取 Int32 时崩溃
【发布时间】:2016-05-24 02:43:16
【问题描述】:

尝试使用 Xcode 7.3 从 NSDictionary 中读取 Swift (2) 中的数据时,我遇到了臭名昭著的 EXC_BAD_INSTRUCTION (code=EXCI386_INVOP,subcode=0X0) 错误:

let aDict = data as! NSDictionary
car.tempo = aDict["tempo"] as! Int32

虽然没有编译器警告。我知道过去 Xcode、Swift 和 Int32s 存在问题。有什么建议可以更好地处理这个问题吗?蒂亚!

由于可能不清楚 - 上面显示的数据保证包含来自 plist 文件的数据,并且 aDict["tempo"] 是一个 NSNumber。

【问题讨论】:

  • "只有当你确定向下转换总是成功时,才使用强制形式的类型转换运算符(as!)。如果你尝试向下转换为,这种形式的运算符将触发运行时错误类类型不正确。”
  • 或者换一种说法,任何时候你使用!,你几乎都是在要求崩溃,所以你需要真正确定你是什么'正在做。

标签: swift core-data crash int32


【解决方案1】:

您没有为键“tempo”设置 aDict 的值...

【讨论】:

    【解决方案2】:

    感谢您的建议。数据没有问题,如果是这样,就不应该出现 EXC_BAD_INSTRUCTION (code=EXCI386_INVOP,subcode=0X0) 错误。这显然是 Xcode 中的一个错误,我将提交一个雷达。 像下面这样重新制定在 Xcode 7.3 中确实有效,因为 NSNumber 被解包为 Int32:

    car.tempo = (aDict["tempo"]?.intValue)!
    

    再次感谢!

    【讨论】:

    • 不,因为您更改了代码正在执行的操作以避免该问题。这不是 Xcode 中的错误,而是您修复的代码中的错误。在您尝试将NSNumber 向下转换为Int32 之前,这是不可能的,但as! 强制了问题,因此代码崩溃了。现在您在NSNumber 上调用intValue,这意味着您正在请求NSNumber 的整数值,而不是试图强制对象向下转换为原始类型。顺便说一句,这正是我和@PetahChristian 在我们的 cmets 中描述的。
    • 恭喜双票否决!你原来的cmets刚刚说感叹号很危险。您是否说过从 NSNumber 向下转换为 Int32 是不可能的 - 不同的故事。但是你说的显然一点帮助都没有。
    • 我没有否决这个问题或你的答案。我的评论没有提到NSNumber,因为你没有表明你正在使用一个。使用! 总是冒着崩溃的重大风险,这就是为什么我说你需要确定你在做什么。显然你不是,但你的代码更改修复了它。最初的问题仍然是您的代码中的错误,而不是 Xcode 中的错误。
    • 那么抱歉!认为很明显,NSDictionary 中的数值必须是 NSNumber。作为 Swift 的新手,我错误地认为通过 NSNumber 解包为! Int32 相当于在其上使用 intValue。我将不得不审查 NSNumber 到 Int 等的桥接。我知道 !运算符,但我仍然习惯于不同的集合,有时在 Swift 中缺少编译器警告。无论如何,该错误已得到修复,感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多