从 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)
}
我越来越难以理解为什么会出现异常,因为我默认将其编码为 Int
和 decodeInteger
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)
}
请注意,我是 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)
}
我越来越难以理解为什么会出现异常,因为我默认将其编码为 Int
和 decodeInteger
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)
}