Swift enum和NSCoding
我有一个'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”'错误。
非常感谢。
我要做的就是给枚举类型和编码和解码的原始值,否则执行description
的枚举和编码和解码该字符串。无论哪种方式(或者如果您使用其他方式),您显然需要一种在枚举器和可存档类型之间双向转换的方法。
是的,你需要从原始值访问枚举。完整的例子和讨论在这里:
How do I encode enum using NSCoder in swift?
注意这种变化在Xcode 6.1 fromRaw()/ toRaw()‘枚举的API以新颖的款式,初始化和‘rawValue’“从旧式移动代码’财产“
你如何编码/解码'description'?例如,下面会抛出一个初始化错误:'方向(描述:(aDecoder.decodeObjectForKey(“direction”)as!String))?? .North' – Anconia 2015-08-20 19:22:16
@Anconia请把它作为一个问题,而不是作为一个评论,请!有没有空间谈论在这里... :) – matt 2015-08-20 19:29:37
感谢您的回答,这是一次买你的书(S):-) – Anconia 2015-08-20 20:18:57