为什么Swift选项变为零?

时间:2016-03-29 05:37:31

标签: ios xcode swift

这是我的自定义演示类:

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")

调试结果显示它运行良好

enter image description here

现在我从NSUserDefaults中选择了这样的对象:

let retainData = NSUserDefaults.standardUserDefaults().objectForKey("ff") as! NSData
let retainDemo = NSKeyedUnarchiver.unarchiveObjectWithData(retainData) as! Demo

现在调试后我发现:

enter image description here

现在检查两个结果之间的差异。之前一个id值为nil,从中拾取对象后,id值变为零。我没有对对象做任何改动。只需保存到NSUserdefaults并反向选择。这背后的原因是什么?我该如何克服这个问题?

1 个答案:

答案 0 :(得分:4)

原因是decodeIntegerForKey不返回可选的Int。它返回一个Int。因此,如果ID不存在,则返回0,这通常是Int变量的默认值。您可以通过检查解码器是否具有ID对象来解决此问题。

required init?(coder aDecoder: NSCoder) {
    if aDecoder.containsValueForKey("ID") {
        self.id = aDecoder.decodeIntegerForKey("ID")
    }
}