我有一个类,我正在使用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
部分。然后我可以从那些字符串键解码它们并将它们重新配对。
有没有更好的方法对此进行编码/解码?
我尝试使用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)'
答案 0 :(得分:0)
如果所有内容都是encodeObject
兼容对象,请configuration
使用NSCoding
。
它configuration
是一个包含字符串和字符串数组的数组,应该没有问题。
答案 1 :(得分:0)
除了来自Zaph的回答和他的评论的信息之外,我还提交了我自己的解决方案作为一个独立的答案。
由于configuration
是一个元组数组,因此您无法使用encodeObject
,因为NSKeyedArchiver
和NSKeyedUnarchiver
不支持元组。
根据&#34; Swift编程语言&#34; footnote on tuples:
元组对临时的相关值组很有用。它们不适合创建复杂的数据结构。如果您的数据结构可能超出临时范围,则将其建模为类或结构,而不是作为元组。有关更多信息,请参阅类和结构。
元组可以表示为具有2个属性的类:一个用于第一部分,一个用于第二部分。虽然使它成为一个类并且符合NSObject和NSCoding的额外样板很多,但它使得该对象在未来的使用中更加灵活,因此它有它的权衡。
我创建了a Gist,以便通过示例项目展示它。只需用这个文件替换一个新的单一视图应用程序项目ViewController.swift
并运行(在文件顶部定义的类对象)。
第一次运行时,viewDidLoad
上没有存储的数据,样本数据将被创建并存储在viewDidAppear
上。再次运行它,您会在viewDidLoad
上看到存储的数据已正确加载。您可以取消注释从NSUserDefaults
删除数据的行,然后再次运行以重置存储的数据。