加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift中一个类中的枚举(enum)类型的数据该如何实现序列化(NSC

发布时间:2020-12-14 07:08:11 所属栏目:百科 来源:网络整理
导读:简述 昨天在开发中遇到了这样一个问题,需要用NSUserDefaults持久化一些数据,其中需要保存一个自己定义的类对象。这就需要我们去实现序列化与反序列化,即把对象转化成二进制数据存入取出时再将二进制数据恢复。 实现序列化 class GameData: NSObject{ var

简述

  • 昨天在开发中遇到了这样一个问题,需要用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值初始化了,以此实现序列化和反序列化。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读