Swift枚举和NSCoding

时间:2014-10-20 17:17:15

标签: swift enums nscoding

我有一个带有String属性和NSImage属性的'Thing'对象; Thing类有encodeWithCoder:和decodeWithCoder:方法,我可以使用NSKeyedArchiver / Unarchiver归档和取消归档[Thing]数组。

到目前为止,这么好。现在我想通过一系列方向扩展我的Thing类,其中'Direction'是以下枚举:

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有已被创建 - 所以我会克制。我正在寻找一种快速而又脏的方法来保存我的应用数据并继续前进。)

由于我将需要其他地方的指示,这是一个单独的实体,而不仅仅是Thing类中的枚举。 (不确定这是否有所不同。)

使我的Direction枚举符合NSCoding的最佳方法是什么? 我能提出的最好的解决方法是创建一个[String:String]字典,其中“North”和“South”作为键,“thing2”和“thing3”作为值,并从中重构我的enum属性,但是有一个更好的方法? 就此而言,有没有办法使元组符合NSCoding,因为现在(String,String)让我“与协议不兼容”AnyObject“'错误。

非常感谢。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

是的,您需要从RAW值访问枚举。这里有完整的例子和讨论:

How do I encode enum using NSCoder in swift?

请注意Xcode 6.1和#34;将代码从旧式“fromRaw()/ toRaw()”枚举API移动到新的样式初始化程序和“rawValue”属性"

https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html