ios - 为什么 Swift 可选变成零?

标签 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 并反向选择。这背后的原因是什么?我该如何克服这个问题?

最佳答案

原因是 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/

相关文章:

objective-c - 无法隐藏标签栏中的中心图像

ios - 使用 AutoLayout 使 UIView 高度适合其内容

ios - LLDB 从库中打印出 NSException 名称或类

ios - Xcode 4.5 中在哪里设置 translatesAutoresizingMaskIntoConstraints

ios - 显示 UIPickerView 文本框被选中,选中后隐藏

ios - 在 UICollectionView 中滚动时绕过 UIScrollViewDelegate

ios - UIDocument中如何实现文件协调

swift - 我可以阻止 XCode 因 fatalError/preconditionFailure 而中断吗?

ios - 如何在.DecimalPad iOS键盘上添加减号?

Swift Codable Type 编码成功但解码失败