NSBder在decodeBool forKey上崩溃(Xcode 8,Swift 3)

Enl*_*lil 5 xcode boolean nskeyedarchiver nskeyedunarchiver

我有这个简单的课程

import UIKit

class SimpleModel: NSObject, NSCoding {

    var name : String!
    var done : Bool!

    init(name:String) {
        self.name = name
        self.done = false
    }

    internal required init?(coder aDecoder: NSCoder) {
        self.name = aDecoder.decodeObject(forKey: "name") as! String
        self.done = aDecoder.decodeBool(forKey: "done") // BUG HERE
    }

    func encode(with encoder: NSCoder) {
        encoder.encode(self.name, forKey: "name")
        encoder.encode(self.done, forKey: "done")
    }
}
Run Code Online (Sandbox Code Playgroud)

保存代码:

let data = NSKeyedArchiver.archivedData(withRootObject: storageArray)
UserDefaults.standard.set(data, forKey: "storage")
UserDefaults.standard.synchronize()
Run Code Online (Sandbox Code Playgroud)

读取代码:

if let data = UserDefaults.standard.data(forKey: "storage") {
    storageArray = NSKeyedUnarchiver.unarchiveObject(with: data) as! [SimpleModel]
}
Run Code Online (Sandbox Code Playgroud)

NSKeyedUnarchiver完成它的工作时会出现问题.我无法理解问题的来源.

谢谢!

Enl*_*lil 13

诀窍是删除!形成原始类型.如果你把!你说"制作一个隐式解包的可选项",因此编码器将存档为NSNumber而不是Bool(或Int,Double).如果你删除!编码器将存档为Bool,事情按预期工作(我花了一个"事件",这个解决方案由Apple提供)


小智 12

BoolInt有新的方法:

 self.x = Int(decoder.decodeCInt(forKey: "Speed"))
 self.y = decoder.decodeObject(forKey: "Serial") as! String
 self.z = Bool(decoder.decodeBool(forKey: "Direction") )
Run Code Online (Sandbox Code Playgroud)


msw*_*yss 7

我有同样的问题.试试这个:

self.done = aDecoder.decodeObject(forKey: "done") as? Bool ?? aDecoder.decodeBool(forKey: "done")
Run Code Online (Sandbox Code Playgroud)