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

Swift中类非平凡属性的编码/解码方法 原职,swift,encoding,tuples,decoding,nscoding,Swift,Encoding,Tuples,Decoding,Nscoding,我有一个类,我正在使用NSCoding进行编码和解码。我了解了如何对数字或字符串等基本类型进行编码,甚至还链接了符合NSCODE的类。我还了解了如何对这些基本类型的数组进行编码 我现在遇到的难题是编码字符串、数组和对的组合。具体地说,我试图对这样定义的属性进行编码 var configuration: [([String], String)] 此配置属性中某些条目的示例可以如下所示: configuration[0] = (["config1", "config2

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

我现在遇到的难题是编码字符串、数组和对的组合。具体地说,我试图对这样定义的属性进行编码

var configuration: [([String], String)]
此配置属性中某些条目的示例可以如下所示:

configuration[0] = (["config1", "config2"], "2 configuration options")
configuration[1] = (["config1", "config2", "config3"], "3 configuration options")
所以我的问题是如何将其编码为一对。我在考虑把这对的数组分成两个平行数组。然后我会将它们编码为[[String]],我想我知道怎么做和[String]。我只需要用两个单独的字符串键对它们进行编码,比如这对中.0和.1部分的configuration0和configuration1。然后我可以从这些字符串键中解码它们并将它们重新配对

有没有更好的编码/解码方法

编辑对zaph答案的回复: 我试着用香草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")
我得到的错误是:无法使用“[[String],String],forKey:String”类型的参数列表调用“encodeObject”

如果包含的所有对象都是符合NSCoding的对象,则只需使用encodeObject进行配置


It配置是一个包含字符串数组的数组,应该没有问题。

除了Zaph的答案和评论中的信息外,我还将提交我自己的解决方案作为独立答案

由于配置是元组数组,您将无法使用encodeObject,因为NSKeyedArchiver和NSKeyedUnachiver不支持元组

根据Swift编程语言:

元组对于相关值的临时组很有用。它们不适合创建复杂的数据结构。如果您的数据结构可能会在临时作用域之外持续存在,请将其建模为类或结构,而不是元组。有关更多信息,请参见类和结构

元组可以表示为一个具有两个属性的类:一个用于第一部分,另一个用于第二部分。虽然使其成为一个类并符合NSObject和NSCoding的额外样板文件非常多,但它使对象在将来的使用中更加灵活,因此它有其折衷之处

我创建了一个示例项目来展示它。只需使用此文件替换新的单视图应用程序项目的ViewController.swift,然后运行文件顶部定义的类对象


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

我以前见过元组的奇怪问题,我认为这也是问题的根源。当我尝试正常地对其进行编码时,会出现以下错误:无法使用类型为“[[String],String],forKey:String”的参数列表调用“encodeObject”,它们不应用于数据结构,来自Apple iBook Swift:“元组对于相关值的临时组很有用。它们不适合创建复杂的数据结构。如果您的数据结构可能会超出临时范围,请将其建模为类或结构,而不是元组。”摘自:Apple Inc.“Swift编程语言Swift 2预发布版”我想这正好让我回到了我最初的问题,我说:所以我的问题是如何将它编码为一对。从技术上讲,我可以把我的对[String],字符串到它自己的类中,包含两个属性,即对的第一部分和第二部分,但对一个数组中包含的两个并行数组进行编码似乎需要大量开销。特别是Objective-C没有元组。它们不是NSKeyedArchiver或NSKeyedUnachiver支持的类型。请将元组更改为arr是的。我能够从我仍然打开的选项卡中恢复大部分内容并重新编写。我已经从被拒绝的编辑中添加了我自己的答案。谢谢你的建议,因为它确实帮了我很多忙。