Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中保存结构_Swift_Serialization_Struct_Nscoding_Value Type - Fatal编程技术网

在Swift中保存结构

在Swift中保存结构,swift,serialization,struct,nscoding,value-type,Swift,Serialization,Struct,Nscoding,Value Type,今年刚从WWDC观看了几段关于Swift价值类型的视频 我发现自己已经完全准备好接受应用程序中的价值类型。这意味着更少的类类型和更多的结构。但是如何保存这些数据呢?以前,对于类,我会采用NSCoding,但这要求我采用NSObject,这将要求我使用类而不是结构 以下是我看到的选项: 如果需要保存,则模型对于结构来说过于复杂,应该将其重新设计为类 使用中介类 我该怎么做呢?据我所知,整个NSCoding业务旨在存储/检索对象树。因此需要将NSObject作为基类(我想,也许在将来的某个

今年刚从WWDC观看了几段关于Swift价值类型的视频


我发现自己已经完全准备好接受应用程序中的价值类型。这意味着更少的类类型和更多的结构。但是如何保存这些数据呢?以前,对于类,我会采用NSCoding,但这要求我采用NSObject,这将要求我使用类而不是结构

以下是我看到的选项:

  • 如果需要保存,则模型对于结构来说过于复杂,应该将其重新设计为类
  • 使用中介类

我该怎么做呢?

据我所知,整个
NSCoding
业务旨在存储/检索对象树。因此需要将
NSObject
作为基类(我想,也许在将来的某个时候,它可能会被移动到
AnyObject

因此,这类树中的每个类都有责任对其属性(包括结构)的值进行编码/解码。所有这些结构都将不可避免地在某种程度上作为对象的属性保留,对吗


鉴于上述情况,我认为需要探索的方向是扩展NSCoder协议,使用
encodeFoo(foo:foo,forKey:String)
decodeFooForKey(key:String)->foo
,其中
foo
将是您的自定义结构之一,然后在实现
NSCoding
协议的类中使用这些函数,就像在基本Obj-C类型中使用类似函数一样。

是的,NSCoding的一个内置功能是,无论是否对循环进行编码—无论对象图是什么,
NSCoding
将仅对其中的每个唯一对象编码一次,如果您有一个循环链接队列,则不会衍生到无限循环中。这意味着它沉浸在引用语义学的世界中,在Objective-C领域。所以给它一个值或引用类型的修改可能需要一点努力,而且还没有发生。@Tommy,对于对象,只需指针就可以唯一地识别它们。对于值类型实例,如何使它们处于循环中?没有讽刺意味,只是尝试学习一些新的东西。不,不可能有一个价值语义的循环。我的意思是:键控的archiver有一个纯粹的Objective-C世界视图,由于语义差异,更新会很麻烦。所以苹果还没有。我同意你关于初衷和设计的第一句话,同时猜测为什么苹果到撰写本文时还没有改变最初的设计。