как использовать наследование в декодируемой модели - PullRequest
0 голосов
/ 01 июля 2019

У меня есть некоторые результаты JSON, которые я получаю с сервера. Все они имеют общий раздел. и после этого в свойстве results возвращаемые значения различаются.

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

        }
}

Как я уже сказал, структура одинакова для всех моих моделей. они отличаются только results. Я хочу избежать написания избыточного кода и использовать наследование для создания BaseClass, который имеет все общие разделы, а мои модели наследуют этот BaseClass. Я видел несколько уроков и постов об наследовании в Decodable моделях, но все же я не уверен, как мне его реализовать.

1 Ответ

1 голос
/ 01 июля 2019

Вместо наследования и классы используют обобщения и структуры , поскольку 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)
    }
}

И использовать его для словаря, содержащего id и title

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

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