2014-10-20 84 views
4

我有一个'Thing'对象具有一个String属性和一个NSImage属性; Thing类具有encodeWithCoder:和decodeWithCoder:方法,我可以使用NSKeyedArchiver/Unarchiver对[Thing]数组进行归档和解除归档。Swift enum和NSCoding

到目前为止,一切都很好。现在我想的方向阵列,其中“方向”是以下枚举扩大我的事类:

enum Direction{ 

case North(direction:String) 
case East(direction:String) 
case South(direction:String) 
case West(direction:String) 

} 

换句话说,我要保存的数据是

thing1.directions: Direction = [.North("thing2"), .South("thing3")] 

(在一个更完美的世界,我会直接引用我的东西,而不仅仅是他们的名字,但我意识到这将很容易创建引用循环 - 无法设置引用另一个东西,直到那东西被创建 - 所以我“不要会,我正在寻找一个快速和肮脏的方法来保存我的应用程序数据和移动。)

由于我将需要其他方向,这是一个独立的实体,而不仅仅是Thing类中的枚举。 (不知道是否有差别。)

是什么力量让我的方向枚举符合NSCoding最好的方法是什么? 我能拿出最好的解决方法包括创建一个[字符串:字符串]字典,“北方”和“南方”作为键和“thing2”和“thing3”为价值观,重建从我的枚举的财产,但有更好的方法? 就此而言,有没有办法使元组符合NSCoding,因为现在(String,String)让我'不兼容协议“AnyObject”'错误。

非常感谢。

回答

5

我要做的就是给枚举类型和编码和解码的原始值,否则执行description的枚举和编码和解码该字符串。无论哪种方式(或者如果您使用其他方式),您显然需要一种在枚举器和可存档类型之间双向转换的方法。

+0

你如何编码/解码'description'?例如,下面会抛出一个初始化错误:'方向(描述:(aDecoder.decodeObjectForKey(“direction”)as!String))?? .North' – Anconia 2015-08-20 19:22:16

+0

@Anconia请把它作为一个问题,而不是作为一个评论,请!有没有空间谈论在这里... :) – matt 2015-08-20 19:29:37

+0

感谢您的回答,这是一次买你的书(S):-) – Anconia 2015-08-20 20:18:57