gpt4 book ai didi

swift - NSCoding-Compliant 是什么意思?

转载 作者:IT王子 更新时间:2023-10-29 05:53:18 25 4
gpt4 key购买 nike

所以我正在学习本教程,我终于弄清楚了如何使用 NSCoding 归档对象,以及如何使用可失败初始化器从文件系统再次初始化它。

// To encode the object in the first place

func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
}

// To 're-initialize' the object

required init?(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObject(forKey: "name") as! String
super.init()
}

但是,我仍然不太清楚整个过程在较高层次上是如何运作的。请告诉我我的想法在哪里不正确。

1) 如果你的对象采用了 NSCoding 协议(protocol),你可以使用 encode(with:) 函数让一个 NSCoder 对象通过该函数传递并执行一个 'encode' 方法,传递你的对象的实例属性(这是一个对象本身)作为第一个参数,一个表示键的字符串作为第二个值。

2) 这是一个递归过程,所以从本质上讲,您传递对象的实例属性(即名称)的原因是该属性(它是一个对象)可以发送编码消息,依此类推直到它不再到达 NSCoding 采用者为止。

3)aDecoder 对象也可以解码,所以在自定义对象初始化时,您需要使用可失败初始化器来解码为您使用的不明确字符串键设置的任何对象。

这是我真的不明白的...

aDecoder 对象如何知道将哪个单独的对象用于键集?例如,假设我有 10 个狗对象实例。当系统通过 aDecoder 时,我在其上使用 decodeObject 方法,并通过键将 self.name 设置为该解码对象的值,aDecoder 如何知道这条狗的名字被保存为“Jack”,而不是不小心捕获了另一个狗实例的名字之一,例如“Jodi”?

换句话说,一旦您对对象的属性进行编码,文件系统如何知道将对象实例 A 的属性与对象实例 B 的属性分开,因此,当应用程序重新启动并且对象 A 被初始化时, 它只抓取对象 A 的属性?

谢谢

最佳答案

我认为您遗漏的部分(如果我错了请纠正我)是 NSCoding 不是数据库。它是一种协议(protocol),它定义了一种序列化对象的方法。

用于解码的 NSCoder 知道哪个对象,因为那是被编码到其中的对象。例如,如果您使用 NSKeyedArchiver(NSCoder 子类,以及使用 NSCoding 的常用方法)将 Dog 保存到磁盘上名为“/tmp/jack.dog”的文件中,那么您稍后可以使用 NSKeyedUnarchiver 加载“/tmp/jack.dog”,并将其反序列化回 Dog 实例。它“知道哪个对象”,因为那是(唯一的)保存到该文件的对象。

它不一定是一个文件。可以保存数据anywhere at all .

关于swift - NSCoding-Compliant 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41232808/

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