这是我的自定义演示类:
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 并反向选择。这背后的原因是什么?我该如何克服这个问题?
最佳答案
原因是 decodeIntegerForKey
没有返回可选的 Int。它返回一个 Int。因此,如果 ID 不存在,则返回 0,这通常是 Int 变量的默认值。您可以通过检查解码器是否具有 ID 对象来解决此问题。
required init?(coder aDecoder: NSCoder) {
if aDecoder.containsValueForKey("ID") {
self.id = aDecoder.decodeIntegerForKey("ID")
}
}
关于ios - 为什么 Swift 可选变成零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36276246/