Swift中一個類中的枚舉(enum)類型的數據該如何實現序列化(NSCoder)

簡述

  • 昨天在開發中遇到了這樣一個問題,須要用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

相關文章
相關標籤/搜索