Tengo algunos resultados de JSON que estoy recibiendo del servidor. Todos ellos tienen una sección compartida. y después de eso, en una propiedad results, los valores de devolución difieren.

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

        }
}

Como dije, la estructura es la misma para todos mis modelos. solo difieren en results. Lo que quiero hacer es evitar escribir un código redundante y usar la herencia para crear un BaseClass que tiene toda la sección compartida y mis modelos heredan este BaseClass. He visto algunos tutoriales y publicaciones sobre la herencia en los modelos Decodable, pero todavía estoy tan discreta sobre cómo puedo implementarlo.

0
Hos Ap 1 jul. 2019 a las 20:02

1 respuesta

La mejor respuesta

En lugar de la herencia y las clases , usan genéricos y estructuras porque Decodable no admite la herencia de forma predeterminada.

Por ejemplo, crea una estructura 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)
    }
}

Y usándolo para el diccionario que contiene id y 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) }
1
vadian 1 jul. 2019 a las 17:35