以下是一个如何使对象符合NSCoding
的示例。基本上,您需要提供两种方法的实现 - required convenience init?(coder decoder: NSCoder)
和encode(with aCoder: NSCoder)
class Book: NSObject, NSCoding {
var title: String?
var pageCount: Int?
init(title: String,pageCount: Int) {
self.title = title
self.pageCount = pageCount
}
required convenience init?(coder decoder: NSCoder) {
guard let title = decoder.decodeObject(forKey: "title") as? String else { return nil }
self.init(title: title, pageCount: decoder.decodeInteger(forKey: "pageCount"))
}
func encode(with aCoder: NSCoder) {
aCoder.encode(self.title, forKey: "title")
aCoder.encodeCInt(Int32(self.pageCount), forKey: "pageCount")
}
}
我建议您将
setCustomObject
方法更改为以下内容:
此外,我建议您将
setCustomObject
方法更改为以下内容:
func setCustomObject(obj:NSCoding, key:String) {
let encodedObject : Data = NSKeyedArchiver.archivedData(withRootObject: obj)
UserDefaults.standard.set(encodedObject, forKey: key)
}
编译器这样做是为了防止您向NSKeyedArchiver
传递一个不符合NSCoding
协议的对象。
如果您不想在init
方法中提供所有属性,可以使用默认值:
init(title : String? = nil, pageCount: Int? = nil){
self.title = title
self.pageCount = pageCount
}
现在您可以只使用
Book()
来初始化对象,而无需任何属性。
CustomObject
是否符合NSCoding
协议? - Juri Noga