2014-10-20 61 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