【问题标题】:how to use inheritance in decodable model如何在可解码模型中使用继承
【发布时间】:2019-07-02 01:35:01
【问题描述】:

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

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

        }
}

正如我所说,我的所有模型的结构都是相同的。它们仅在results 上有所不同。我想要做的是避免编写冗余代码,并使用继承创建一个具有所有共享部分的BaseClass,我的模型继承这个BaseClass。我在Decodable 模型中看到了一些关于继承的教程和帖子,但我仍然对如何实现它感到迷茫。

【问题讨论】:

  • 我会使用通用包装器而不是继承。对于类似的东西,请参阅:stackoverflow.com/questions/53875382/…
  • 解释结果部分的不同之处以及您想要实现的目标
  • @dan 在这种情况下,我更喜欢坚持继承
  • @JoakimDanielson 假设我们在results 中有一个带有idtitle 的模型。 B 模型在results 中有typeitem

标签: swift decodable


【解决方案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) }

【讨论】:

  • 这样,每次我想要整个对象(代码、状态、总数、计数)时,我都必须使用 JSONParser
  • 得到整个对象,只是results的类型(JSONParser的泛型)不同。
  • 我明白了,但是如果我想创建它的一个实例,我必须像这样声明它:let myModel: JSONParser&lt;Item&gt;,它看起来有点不直接。顺便说一句,这是一种优雅的方式。
  • 这只是一个例子。您可以将外部对象 JSONParser 重命名为其他名称,例如 Base 并删除 init 方法。然后解码Base.self,得到一个对象Base&lt;Item&gt;
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2017-06-12
  • 2019-05-25
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多