从 Swift 中的存档解码对象时出现 NSInvalidUnarchiveOperationException 错误

NSInvalidUnarchiveOperationException error when decoding object from archive in Swift

请注意,我是 Swift 和 iOS 编程的新手,所以你们中的一些人可能会觉得这有点傻。

无论如何,我正在编码一个 Int 对象并将其与 String 键相关联,如下所示:

func encodeWithCoder(aCoder: NSCoder) {
    // Note that `rating` is an Int
    aCoder.encodeObject(rating, forKey: PropertyKey.ratingKey)

}

现在,当我尝试像这样解码它时:

required convenience init?(coder aDecoder: NSCoder) {
    let rating = aDecoder.decodeIntegerForKey(PropertyKey.ratingKey)

    // Initialising a model class
    self.init(rating: rating)
}

常量 rating 应为 Int,因为 decodeIntegerForKey 默认为 return Int

构建进展顺利,但是当我 运行 它崩溃并记录如下复制的错误时。

Terminating app due to uncaught exception 
'NSInvalidUnarchiveOperationException', 
reason: '*** -[NSKeyedUnarchiver decodeInt64ForKey:]: 
value for key (rating) is not an integer number'

但是 当我将 decodeIntegerForKey 更改为 decodeObjectForKey 并将 return 值向下转换为 [=15= 时,它似乎运行良好].

像这样:

required convenience init?(coder aDecoder: NSCoder) {
    // Replaced `decodeInteger` with `decodeObject` and downcasting the return value to Int 
    let rating = aDecoder.decodeObjectForKey(PropertyKey.ratingKey) as! Int
    self.init(rating: rating)
}

我越来越难以理解为什么会出现异常,因为我默认将其编码为 IntdecodeInteger return 一个 Int。

此外,我觉得 NSInvalidUnarchiveOperationException 告诉我我使用了错误的操作来解码编码对象。

这对我来说没有任何意义,帮助

此问题已解决。感谢@PhillipMills 的澄清。

编码 Int 对象时执行错误。我在 AnyObject 而不是 Int 中对其进行编码,并试图将其解码为 Int。这就是为什么我不得不向下转换它并解码为 Int 不起作用的原因。

编码应该是这样完成的:

func encodeWithCoder(aCoder: NSCoder) {
    // Note that `rating` is an Int
    aCoder.encodeInteger(rating, forKey: PropertyKey.ratingKey)

}