gpt4 book ai didi

swift - 所需的编码功能未在工作代码中显示

转载 作者:行者123 更新时间:2023-11-28 15:30:14 25 4
gpt4 key购买 nike

序列化反序列化是通过NSCoding协议(protocol)中定义的两个方法完成的,如下所示

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) 函数。是不是您必须实现它所需的手段?

感谢您的宝贵时间和帮助

最佳答案

Why the code is working with out implement the required NSCoding function?

这不是真的。

NSCoding 是一个协议(protocol)

首先 NSCoding 是一个协议(protocol),而不是一个函数。为了使类型符合 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),该机制确实正常工作。

关于swift - 所需的编码功能未在工作代码中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44790814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com