序列化和反序列化由NSCoding
协议中定义的两种方法完成,如下所示
encodeWithCoder(_ aCoder: NSCoder) {
// Serialize your object here
}
init(coder aDecoder: NSCoder) {
// Deserialize your object here
}
在我自己的ViewController
(继承自UITableViewController
)中,我有一个包含我自己的对象Item
的数组,我确实实现了init(coder aDecoder: NSCoder)
初始函数。 Item
定义如下
class Item: NSObject, NSCoding {
var text = ""
var checked = false
func toggleChecked() {
checked = !checked
}
func encode(with aCoder: NSCoder) {
aCoder.encode(self.text, forKey: "SLAText")
aCoder.encode(self.checked, forKey: "SLAChecked")
}
required init?(coder aDecoder: NSCoder) {
self.text = aDecoder.decodeObject(forKey: "SLAText") as! String
self.checked = aDecoder.decodeBool(forKey: "SLAChecked")
super.init()
}
override init() {
super.init()
}
}
而是实现函数encode(with: NSCoder)
我定义了自己的名为saveItems()
func saveItems() {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.encode(items, forKey: "ItemLists") //items is a array of type [Item]
archiver.finishEncoding()
data.write(to: dataFilePath(), atomically: true)
}
问题
为什么代码正在使用实现所需的NSCoding
函数?从我正在研究的书的例子中简化了代码,我根本找不到encodeWithCoder(_ aCoder: NSCoder)
函数。是否必须实施它?
感谢您的时间和帮助
答案 0 :(得分:1)
为什么代码无法实现所需的NSCoding功能?
事实并非如此。
首先,NSCoding
是一个协议,而不是一个函数。并且为了使类型符合NSCoding
,您需要实现方法和初始化程序
public func encode(with aCoder: NSCoder)
public init?(coder aDecoder: NSCoder)
让我们来看看你在做什么
archiver.encode(items, forKey: "ItemLists")
此处items
定义为[Item]
,即Item(s)
的数组。
而Array确实符合NSCoding
。这可以通过编写
let nums = [1, 2, 3]
if nums is NSCoding {
print("Array does conform to NSCoding")
} else {
print("Array does NOT conform to NSCoding")
}
结果是
Array does conform to NSCoding
当然,为了正常工作,数组内部的元素也必须符合NSCodable
。由于数组的泛型类型是Item(您使其符合NSCodable
),因此 机制正常工作。