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

时间:2016-01-12 19:30:07

标签: swift cocoa-touch foundation

请注意,我对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默认会返回Int

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

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

但是当我将decodeIntegerForKey更改为decodeObjectForKey并将返回值转发为Int时,它似乎运作良好。

像这样:

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)
}

我很难理解异常的原因,因为我将其编码为Int并且decodeInteger默认返回Int。

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

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

1 个答案:

答案 0 :(得分:1)

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

编码Int对象时执行错误。我在AnyObject而不是Int对其进行编码,并尝试将其解码为Int。这就是为什么我不得不将它转发并解码为Int无效。

编码应该是这样完成的:

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

}