在Swift中编码/解码类的非平凡属性的方法

时间:2015-09-02 17:23:05

标签: swift encoding tuples decoding nscoding

原帖

我有一个类,我正在使用NSCoding进行编码和解码。我得到了如何编码基本类型,如数字或字符串,我甚至链接NSCoding兼容类。我还得到了如何编码这些基本类型的数组。

我现在所困扰的是编码字符串,数组和对的组合。具体来说,我正在尝试编码像这样定义的属性

var configuration: [([String], String)]

此配置属性中某些条目的示例可以这样显示:

configuration[0] = (["config1", "config2"], "2 configuration options")
configuration[1] = (["config1", "config2", "config3"], "3 configuration options")

所以我的挂断是如何将其编码为一对。我正在考虑将该对的数组拆分为2个并行数组。然后我将这些编码为[[String]](我认为我知道该怎么做)和[String]。我只是用2个单独的字符串键对它们进行编码,例如"configuration0""configuration1"(对于.0.1部分。然后我可以从那些字符串键解码它们并将它们重新配对。

有没有更好的方法对此进行编码/解码?

编辑(对zaph答案的回应):

我尝试使用vanilla encodeObject对其进行编码。这是代码:

var configuration: [([String], String)] = Array<([String], String)>(count: 2, repeatedValue: ([],""))
var firstConfig: ([String], String) = (["config1", "config2"], "2 configuration options")
var secondConfig: ([String], String) = (["config1", "config2", "config3"], "3 configuration options")
configuration[0] = firstConfig
configuration[1] = secondConfig
coder.encodeObject(configuration, forKey: "configuration")

我得到的错误是:Cannot invoke 'encodeObject' with an argument list of type '([([String], String)], forKey: String)'

2 个答案:

答案 0 :(得分:0)

如果所有内容都是encodeObject兼容对象,请configuration使用NSCoding

configuration是一个包含字符串和字符串数组的数组,应该没有问题。

答案 1 :(得分:0)

除了来自Zaph的回答和他的评论的信息之外,我还提交了我自己的解决方案作为一个独立的答案。

由于configuration是一个元组数组,因此您无法使用encodeObject,因为NSKeyedArchiverNSKeyedUnarchiver不支持元组。

根据&#34; Swift编程语言&#34; footnote on tuples

  

元组对临时的相关值组很有用。它们不适合创建复杂的数据结构。如果您的数据结构可能超出临时范围,则将其建模为类或结构,而不是作为元组。有关更多信息,请参阅类和结构。

元组可以表示为具有2个属性的类:一个用于第一部分,一个用于第二部分。虽然使它成为一个类并且符合NSObject和NSCoding的额外样板很多,但它使得该对象在未来的使用中更加灵活,因此它有它的权衡。

我创建了a Gist,以便通过示例项目展示它。只需用这个文件替换一个新的单一视图应用程序项目ViewController.swift并运行(在文件顶部定义的类对象)。

第一次运行时,viewDidLoad上没有存储的数据,样本数据将被创建并存储在viewDidAppear上。再次运行它,您会在viewDidLoad上看到存储的数据已正确加载。您可以取消注释从NSUserDefaults删除数据的行,然后再次运行以重置存储的数据。