昨天在開發中遇到了這樣一個問題,須要用NSUserDefaults持久化一些數據,其中須要保存一個本身定義的類對象。這就須要咱們去實現序列化與反序列化,即把對象轉化成二進制數據存入取出時再將二進制數據恢復。javascript
class GameData: NSObject{ var level:Int! var gameMode:GameMode! init(level l:Int, gameMode gm:GameMode){ level = l gameMode = gm } required init?(coder aDecoder: NSCoder) { self.level = aDecoder.decodeIntegerForKey("Level") } func encodeWithCoder(aCoder:NSCoder){ aCoder.encodeInteger(level,forKey:"Level") } }
這是我定義的一個類,用來記錄遊戲模式和遊戲的關卡數,咱們能夠看到level的序列化很好實現由於他是一個Int類型,然而在實現GameMode序列化的時候卻出了問題,我無法使用aDecoder.decodeObjectForKey()
由於個人GameMode是個枚舉enum啊-_-java
enum GameMode { case Practice, Challenge }
上面就是我定義的枚舉ui
辦法很容易,咱們只須要將其變成一個定義值得枚舉便可。code
enum GameMode: Int { //不定義值也行,默認就是從0開始 case Practice = 0 case Challenge = 1 }
接下來序列化就很簡單了。對象
class GameData: NSObject{ var level:Int! var gameMode:GameMode! init(level l:Int, gameMode gm:GameMode){ level = l gameMode = gm } required init?(coder aDecoder: NSCoder) { self.level = aDecoder.decodeIntegerForKey("Level") self.gameMode = GameMode(rawValue: aDecoder.decodeIntegerForKey("GameMode")) } func encodeWithCoder(aCoder:NSCoder){ aCoder.encodeInteger(level,forKey:"Level") aCoder.encodeInteger(gameMode.rawValue, forKey: "GameMode") } }
咱們根據rowValue
去進行序列化以及初始化話就好了。遊戲
其實枚舉原本就是一個Int,所以咱們將其聲明爲Int型就能夠根據Int值初始化了,以此實現序列化和反序列化。ip