Swift使用原生Codable协议JSON转模型--枚举直接映射

文章仅简单的通过例子说明如何将JSON中的String与Int直接转为Swift中的enum和遵守OptionSet协议的类型

/*
 需要注意的是 使用的枚举必须继承, 而且也必须遵守Codable协议, JSON中对应的数据字符串必须和枚举中定义的一模一样,否则就转模型失败 直接整个对象都为空
 */

struct OnPunchMan: Codable {
    var name: String?
    var birthday: Date?
    var sex: Sex?
    var skill: [Skill]?
    var vocation: [Vocation]? // Vocation类型虽然可以在赋值的时候直接附一个数组形式,但是在从JSON转模型的时候, 如果JSON是一个[0, 1, 2]的数组,那么Vocation也必须也是一个数组, 否则也转成空了
}

/// rawValue为String的枚举
///
/// - man: 男
/// - woman: 女
/// - unknown: 未知
enum Sex: String, Codable {
    case man = "man"
    case woman = "woman"
    case unknown = "unknown"
}

/// 必杀技系列
/// 注意 就算没有等号赋值 也是可以编译成功的 case noCare的默认值就是"noCare", case veryCare的默认值就是"veryCare"以此类推
/// - noCare: 琦玉一般系列
/// - veryCare: 琦玉认真系列
/// - haha: 琦玉沙雕系列
enum Skill: String, Codable {
    case noCare
    case veryCare
    case haha
}

/// 职业
struct Vocation: OptionSet, Codable {
    typealias RawValue = Int
    
    var rawValue: Int
    
    init(rawValue: Int) {
        self.rawValue = rawValue
    }
    
    static let saber = Vocation(rawValue: 1 << 0)
    
    static let archer = Vocation(rawValue: 1 << 1)
    
    static let lancer = Vocation(rawValue: 1 << 2)
    
    static let rider = Vocation(rawValue: 1 << 3)
    
    static let berserker = Vocation(rawValue: 1 << 4)
    
    static let caster = Vocation(rawValue: 1 << 5)
    
    static let assassin = Vocation(rawValue: 1 << 6)
}

例子如下:

func jsonToModelEnum() {
        let onePunchManString = #"{"name": "sola", "birthday": 562608000, "sex": "unknown", "skill": ["noCare", "veryCare", "haha"], "vocation": [0, 1, 2]}"#
        let onePunchManStringData = onePunchManString.data(using: .utf8)!
        let onePunchMan = try? JSONDecoder().decode(OnPunchMan.self, from: onePunchManStringData)
        let vocation: Vocation = .saber
        let vocations: Vocation = [.archer, .saber]
        print(onePunchMan)
    }

打印结果:

Optional(OnPunchMan(name: Optional("sola"), birthday: Optional(2018-10-30 16:00:00 +0000), sex: Optional(Sex.unknown), skill: Optional([Skill.noCare, JiuRongCarERP.Skill.veryCare,Skill.haha]), vocation: Optional([Vocation(rawValue: 0),Vocation(rawValue: 1),Vocation(rawValue: 2)])))

结论:如果与后台商量好,那么JSON转Swift模型中,就算模型中有枚举类型,也不要中间层进行转换了,直接使用即可!

转载于:https://www.jianshu.com/p/d1a8b2579f2c

猜你喜欢

转载自blog.csdn.net/weixin_34320159/article/details/91270569