Swift开发 codable 的使用,如果后台返回的数据类型与模型定义的不一样,那么如何单独处理某个属性呢?

85 阅读1分钟

处理一个接口,后台返回的数据是这样的

BaseModel<DataModel>(code: 200, data: false, msg: "用户名不存在"),

定义的模型是这样的,
struct BaseModel<T: Codable>: Codable {
    var code: Int
    var data: T?
    var msg: String
}

然后就解析失败了。

首先应该是后台的问题,没理由返回Bool类型啊。但是今天节假日,所以

修改了模型,添加如下的方法,然后就可以快乐的使用

.map(BaseModel<DataModel>.self)

struct BaseModel<T: Codable>: Codable {
    var code: Int
    var data: T?
    var msg: String
    
    
    enum CodingKeys: String, CodingKey {
        case code
        case data
        case msg
    }
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        code = try container.decode(Int.self, forKey: .code)
        msg = try container.decode(String.self, forKey: .msg)
        if let value = try? container.decode(T.self, forKey: .data) {
            data = value
        } else {
            data = nil
        }
    }
}