简述
昨天在开发中遇到了这样一个问题,需要用NSUserDefaults持久化一些数据,其中需要保存一个自己定义的类对象。这就需要我们去实现序列化与反序列化,即把对象转化成二进制数据存入取出时再将二进制数据恢复。
实现序列化
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啊-_-
enum GameMode {
case Practice, Challenge
}
上面就是我定义的枚举
解决办法
办法很容易,我们只需要将其变成一个定义值得枚举即可。
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值初始化了,以此实现序列化和反序列化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。