[英]Why Swift optional become zero?
这是我自定义的Demo类:
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")
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.