NSCoder 在 decodeBool forKey (Xcode 8, Swift 3) 上崩溃
NSCoder crash on decodeBool forKey (Xcode 8, Swift 3)
我有这个简单的class
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")
}
}
保存密码:
let data = NSKeyedArchiver.archivedData(withRootObject: storageArray)
UserDefaults.standard.set(data, forKey: "storage")
UserDefaults.standard.synchronize()
阅读代码:
if let data = UserDefaults.standard.data(forKey: "storage") {
storageArray = NSKeyedUnarchiver.unarchiveObject(with: data) as! [SimpleModel]
}
问题发生在 NSKeyedUnarchiver 执行它的工作时。我不明白问题出在哪里。
谢谢!
我遇到了同样的问题。
试试这个:
self.done = aDecoder.decodeObject(forKey: "done") as? Bool ?? aDecoder.decodeBool(forKey: "done")
诀窍是删除!形成原始类型。
如果你把!您说的是 "make an implicit-unwrapped optional",因此编码器将存档为 NSNumber 而不是 Bool(或 Int、Double)。
如果你删除!编码器将存档为 Bool 并且一切按预期工作(我花了 "incident" 并且此解决方案由 Apple 提供)
Bool
和 Int
有新方法:
self.x = Int(decoder.decodeCInt(forKey: "Speed"))
self.y = decoder.decodeObject(forKey: "Serial") as! String
self.z = Bool(decoder.decodeBool(forKey: "Direction") )
我有这个简单的class
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")
}
}
保存密码:
let data = NSKeyedArchiver.archivedData(withRootObject: storageArray)
UserDefaults.standard.set(data, forKey: "storage")
UserDefaults.standard.synchronize()
阅读代码:
if let data = UserDefaults.standard.data(forKey: "storage") {
storageArray = NSKeyedUnarchiver.unarchiveObject(with: data) as! [SimpleModel]
}
问题发生在 NSKeyedUnarchiver 执行它的工作时。我不明白问题出在哪里。
谢谢!
我遇到了同样的问题。 试试这个:
self.done = aDecoder.decodeObject(forKey: "done") as? Bool ?? aDecoder.decodeBool(forKey: "done")
诀窍是删除!形成原始类型。 如果你把!您说的是 "make an implicit-unwrapped optional",因此编码器将存档为 NSNumber 而不是 Bool(或 Int、Double)。 如果你删除!编码器将存档为 Bool 并且一切按预期工作(我花了 "incident" 并且此解决方案由 Apple 提供)
Bool
和 Int
有新方法:
self.x = Int(decoder.decodeCInt(forKey: "Speed"))
self.y = decoder.decodeObject(forKey: "Serial") as! String
self.z = Bool(decoder.decodeBool(forKey: "Direction") )