所需的编码功能未在工作代码中显示
The required encoding function doesn't shown in a working code
序列化和反序列化是通过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)
函数。 required means 你不是必须实施它吗?
感谢您的宝贵时间和帮助
Why the code is working with out implement the required NSCoding function?
这不是真的。
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
),该机制 确实 正常工作。
序列化和反序列化是通过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)
函数。 required means 你不是必须实施它吗?
感谢您的宝贵时间和帮助
Why the code is working with out implement the required NSCoding function?
这不是真的。
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
),该机制 确实 正常工作。