这是我的自定义演示类:
class Demo: NSObject, NSCoding {
var id: Int?
override init() {
super.init()
}
required init?(coder aDecoder: NSCoder) {
self.id = aDecoder.decodeIntegerForKey("ID")
}
func encodeWithCoder(aCoder: NSCoder) {
if let id = self.id{
aCoder.encodeInteger(id, forKey: "ID")
}
}
}
保存我已创建一个对象并保存到NSUserDefaults中,如下所示:
let demo = Demo()
let archiveData = NSKeyedArchiver.archivedDataWithRootObject(demo)
NSUserDefaults.standardUserDefaults().setObject(archiveData, forKey: "ff")
调试结果显示它运行良好
现在我从NSUserDefaults中选择了这样的对象:
let retainData = NSUserDefaults.standardUserDefaults().objectForKey("ff") as! NSData
let retainDemo = NSKeyedUnarchiver.unarchiveObjectWithData(retainData) as! Demo
现在调试后我发现:
现在检查两个结果之间的差异。之前一个id值为nil,从中拾取对象后,id值变为零。我没有对对象做任何改动。只需保存到NSUserdefaults并反向选择。这背后的原因是什么?我该如何克服这个问题?
答案 0 :(得分:4)
原因是decodeIntegerForKey
不返回可选的Int。它返回一个Int。因此,如果ID不存在,则返回0,这通常是Int变量的默认值。您可以通过检查解码器是否具有ID对象来解决此问题。
required init?(coder aDecoder: NSCoder) {
if aDecoder.containsValueForKey("ID") {
self.id = aDecoder.decodeIntegerForKey("ID")
}
}