Swift Codable: 服务端新增枚举类型解析失败?

Posted 夏天然后

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift Codable: 服务端新增枚举类型解析失败?相关的知识,希望对你有一定的参考价值。

前言: 服务端新增枚举类型, 客户端数据解析失败如何解决?

  1. 首先定义一个枚举类型, 准备在 model 中使用
/// 交易类型
enum TradeType: Int, CaseIterable 

    /// 普通商品交易进账
    case generalIncome = 1

    /// 提现成功
    case withdrawSuccess = 2

    /// 提现中
    case withdrawing = 5

    /// 提现失败
    case withdrawFailed = 6

    /// 匠人余额扣除
    case balanceDeduction = 7

    /// 卡券交易进账
    case couponIncome = 8

    /// 匠人保证金扣除
    case depositDeduction = 20

    /// 锁粉订单佣金减免
    case lockFansOrderCommissionReduce = 21


extension TradeType: Codable 

在 model 中使用枚举

/// 收支明细列表项
struct TradingListItemModel: DJModel 
    
    /// 记录 ID
    @Codec
    var id: Int = 0
    
    /// 操作描述
    var desc: String?
    
    /// 交易类型
    var type: TradeType?
    
    /// 操作后剩余金额
    @Codec
    var remainAmount: CurrencyFen = 0
    
    /// 操作金额
    var amount: String?

如果是上面的定义会存在一个问题, 如果后续, 服务端扩展枚举类型, 而移动端没有进行对应的修改, 数据解析会不成功

所以接下来 我们 需要 有后备 case 的 Enum, 也就是说, 我们可以让 TradeType 这个 Enum 自动处理未知情况。 具体需要怎么做呢

声明一个协议,叫 CodableEnumeration:

protocol CodableEnumeration: RawRepresentable, Codable where RawValue: Codable 
    static var defaultCase: Self  get 

通过 extension,让协议提供默认 Decode 方法:

extension CodableEnumeration 
    init(from decoder: Decoder) throws 
        let container = try decoder.singleValueContainer()
        do 
            let decoded = try container.decode(RawValue.self)
            self = Self.init(rawValue: decoded) ?? Self.defaultCase
         catch 
            self = Self.defaultCase
        
    

之后枚举遵循这个协议

/// 交易类型
enum TradeType: Int, CaseIterable, CodableEnumeration 

    static var defaultCase: TradeType 
        .unknown
    

    /// 未知
    case unknown = 99

    /// 普通商品交易进账
    case generalIncome = 1

    /// 提现成功
    case withdrawSuccess = 2

之后就不怕服务端新增类型, 做到能很好的兼容数据问题 !

以上是关于Swift Codable: 服务端新增枚举类型解析失败?的主要内容,如果未能解决你的问题,请参考以下文章

Swift Codable: 服务端新增枚举类型解析失败?

Swift Codable:如果 API 将来可能向响应 JSON 添加更多属性,则包括枚举编码键

Swift 获取 HTTP JSON 响应并使用 Codable 解析它

Swift 使用Codable协议进行json转模型

如何从 Swift Codable 中排除属性?

Swift Codable 多种类型