繁体   English   中英

为什么Swift可选变为零?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM