如何在可解码模型中使用继承

时间:2019-07-01 17:02:10

标签: swift decodable

我有一些从服务器接收到的json结果。他们都有一个共享的部分。之后,在results属性中,返回值有所不同。

{
    "code": 200,
    "status": "Ok"
    "data": 
        {
            "count": 3,
            "total": 7,
            "results": [
                {
                    "id": 43424,
                    "title": "some title"
                }
            ]

        }
}

正如我所说,所有模型的结构都相同。它们的区别仅在于results。我想要做的是避免编写冗余代码,并使用继承创建一个具有所有共享节的BaseClass,而我的模型继承了此BaseClass。我已经看过Decodable模型中有关继承的一些教程和文章,但是我仍然对如何实现它感到迷惑。

1 个答案:

答案 0 :(得分:1)

而不是继承和使用泛型和结构,因为Decodable默认情况下不支持继承。

例如,创建一个结构JSONParser

struct JSONParser<T : Decodable> {

    struct ResponseData<U : Decodable> : Decodable {
        let total, count : Int
        let results : [U]
    }

    let code : Int
    let status : String
    let data : ResponseData<T>

    init(data: Data) throws {
        let decoder = JSONDecoder()
        data = try decoder.decode(ResponseData.self, from: data)
    }
}

并将其用于包含idtitle的字典

struct Item {
    let id : Int
    let title : String 
}

do {
    let jsonParser = try JSONParser<Item>(data: data)
    let results = jsonParser.data.results
} catch { print(error) }