【发布时间】:2017-12-01 03:05:59
【问题描述】:
序列化和反序列化是通过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) 函数。不是必须的手段你必须实现它吗?
感谢您的时间和帮助
【问题讨论】:
-
Item是如何定义的? -
@appzYourLife 我添加了
Item类的简单版本
标签: swift cocoa archive nscoding