昨天在开发中遇到了这样一个问题,须要用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