可编码的继承问题

时间:2019-06-17 08:20:36

标签: ios swift inheritance

我有一堂课,确认Codable如下。

class ProductListAPIResponse : Codable {
    let success : Bool?
    let message : String?
    let data : [Product]?
    let errors : [String:String]?

    private enum CodingKeys: String, CodingKey {

        case success = "success"
        case message = "message"
        case data = "data"
        case errors = "errors"
    }

    required init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        success = try values.decodeIfPresent(Bool.self, forKey: .success)
        message = try values.decodeIfPresent(String.self, forKey: .message)
        data = try values.decodeIfPresent([Product].self, forKey: .data)
        errors = try values.decodeIfPresent(Dictionary.self, forKey: .errors)
    }


}

它运行良好,在JSON解析中没有问题。由于我的项目中有大约70个API,因此决定做一些可重用性。我写的代码如下。

class APIResponse : Codable {
    let success : Bool?
    let message : String?
    //    let data : [Product]?
    let errors : [String:String]?

    private enum CodingKeys: String, CodingKey {

        case success = "success"
        case message = "message"
        //        case data = "data"
        case errors = "errors"
    }

    required init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        success = try values.decodeIfPresent(Bool.self, forKey: .success)
        message = try values.decodeIfPresent(String.self, forKey: .message)
        //        data = try values.decodeIfPresent([Product].self, forKey: .data)
        errors = try values.decodeIfPresent(Dictionary.self, forKey: .errors)
    }


}
class ProductListAPIResponse : APIResponse {
    var data : [Product]?
    private enum CodingKeys: String, CodingKey {
        case data = "data"
    }
    required init(from decoder: Decoder) throws {

        let containter = try decoder.container(keyedBy: CodingKeys.self)
        data = try containter.decodeIfPresent([Product].self, forKey: .data)
//        let superDecoder = try containter.superDecoder()
        try super.init(from: decoder)
    }
}

现在工作正常。 感谢@vadian

在这种情况下,出现解码器错误,如下所示:

valueNotFound(Swift.KeyedDecodingContainer<Project.APIResponse.(unknown context at $106f478d0).CodingKeys>,
 Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "super", intValue: nil)], debugDescription: "Cannot get keyed decoding
 container -- found null value instead.", underlyingError: nil))

注意:我必须在Product对象中执行与继承我列表中的基本数据相同的继承,而在Product Detail API上我收到相同的数据以及通过继承可以实现的更多详细信息。

0 个答案:

没有答案