微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 符合NSCoding标准是什么意思?

所以我正在阅读本教程,最后我想出了如何使用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协议,你可以使用encode(with :)函数让NSCoder对象通过函数传递并执行’encode’方法,传递你的对象的实例属性(它本身就是一个对象) )作为第一个参数,以及表示键​​作为第二个值的字符串.

2)这是一个递归过程,基本上,你传递对象的实例属性(即名称)的原因是为了使THAT属性(它是一个对象)可以发送编码消息,依此类推等等.直到它不再到达NSCoding采用者.

3)aDecoder对象也可以对事物进行解码,因此在初始化自定义对象时,您将需要使用可用的初始化程序来解码为您使用的模糊字符串键设置的任何对象.

这是我真的不明白的……

aDecoder对象如何知道哪个单独的对象用于该组键?例如,假设我有10个狗对象实例.当系统通过一个解码器,我在它上面使用decodeObject方法,然后按键将self.name设置为该解码对象的值时,aDecoder如何知道这条狗的名字被保存为“杰克”,而不是偶然抓住其中一个狗实例的名字,比如“Jodi”?

换句话说,一旦你对对象的属性进行编码,文件系统如何知道将对象实例A的属性与对象实例B的属性分开,这样,当应用程序被引导备份并且对象A被初始化时,它只是抓住对象A的属性

谢谢

我认为你丢失的那篇文章(如果我错了,请纠正我)是NSCoding不是数据库.它是一种定义序列化对象的方法的协议.

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

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

原文地址:https://www.jb51.cc/swift/319435.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐