请注意,我对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
告诉我,我使用了错误的操作来解码编码对象。
这对我没有任何意义,帮助
答案 0 :(得分:1)
此问题已得到解决。感谢@PhillipMills澄清。
编码Int
对象时执行错误。我在AnyObject
而不是Int
对其进行编码,并尝试将其解码为Int
。这就是为什么我不得不将它转发并解码为Int
无效。
编码应该是这样完成的:
func encodeWithCoder(aCoder: NSCoder) {
// Note that `rating` is an Int
aCoder.encodeInteger(rating, forKey: PropertyKey.ratingKey)
}