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

Swift中一个类中的枚举(enum)类型的数据该如何实现序列化(NSCoder),第1张

概述简述 昨天在开发中遇到了这样一个问题,需要用NSUserDefaults持久化一些数据,其中需要保存一个自己定义的类对象。这就需要我们去实现序列化与反序列化,即把对象转化成二进制数据存入取出时再将二进制数据恢复。 实现序列化 class GameData: NSObject{ var level:Int! var gameMode:GameMode! init(level 简述

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

总结

以上是内存溢出为你收集整理的Swift中一个类中的枚举(enum)类型的数据该如何实现序列化(NSCoder)全部内容,希望文章能够帮你解决Swift中一个类中的枚举(enum)类型的数据该如何实现序列化(NSCoder)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1078149.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存