0

我正在使用以下 Swift 代码解压缩 Swift 类:

 required convenience init(coder decoder: NSCoder) {
    self.init()

    horseID = decoder.decodeIntegerForKey("horseID")
    name    = decoder.decodeObjectForKey("name") as String!

    // if the thumb key does not exist, the following line crashes
    thumb   = decoder.decodeObjectForKey("thumb") as UIImage!
}

“拇指”类成员是后来添加的。我有一个较旧的存档文件,其中没有拇指数据。Apple 的文档说,取消归档不存在的密钥会返回 nil。这是熟悉的 Objective-C 行为。我的 Swift 代码崩溃并出现错误代码:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)。

从 更改asas?并不能解决问题。

这使得在新版本中扩展数据模型变得困难。难道我做错了什么?我是斯威夫特的新手。

4

2 回答 2

2

由于您表示thumb未执行分配,我相信问题出在这条线上

name    = decoder.decodeObjectForKey("name") as String!

解码器可以返回nil并且您正在强制转换为字符串。如果解码器nil在这种情况下返回,您将收到错误消息。我推荐这样的实现:

required convenience init(coder decoder: NSCoder) {
    self.init()

    horseID = decoder.decodeIntegerForKey("horseID")
    name    = decoder.decodeObjectForKey("name") as? String
    thumb   = decoder.decodeObjectForKey("thumb") as? UIImage
}

处理nil可能从编码器返回的值。

于 2015-03-06T15:04:23.620 回答
2

您正在尝试将其强制转换为 UIImage,如果 decodeObjectForKey 返回 nil,它将崩溃。您应该替换asas?以获取可选值,然后您可以检查它是否包含值。

如果 thumb 不是可选的,并且您使用 decodeObjectForKey 获得 nil,您将收到错误消息EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0),即您在评论中提到的错误消息。您不能将 nil 分配给非可选内容。你可以通过给它一个默认值来解决这个问题,以防类型转换会给你一个 nil:

thumb   = decoder.decodeObjectForKey("thumb") as? UIImage ?? [default value here]
于 2015-03-06T14:05:31.453 回答