首页 > 解决方案 > Swift 4 Codable:所有模型的通用结构

问题描述

在这里,我得到了我所有 api 的 API 响应。

{
  "success" : true,
  "message" : "",
  "data" : {
        /multipal data parameter/ 
   }
}

这是我的可编码模型

struct Login: Codable {
    let success: Bool
    let message: String
    let data: Data

    struct Data: Codable  {

    }
}

我如何为成功消息参数创建通用Sturct 。

标签: iosswiftswift4codable

解决方案


您可以使表示网络响应的根结构具有通用性,这将允许您在所有专门的响应之间保持success和部分通用。message

struct NetworkResponse<ResponseData:Codable>: Codable {
    let success: Bool
    let message: String
    let data: ResponseData
}

您不应该创建与内置类型同名的自定义类型,因为这会导致混淆,尤其是对于其他阅读您的代码的人,所以我将您的自定义Data类型重命名为ResponseData.

例如,您可以创建一个LoginResponse模型并像下面这样对其进行解码。您可以对来自同一 API 的其他响应执行相同操作。

let loginResponse = """
{
    "success" : true,
    "message" : "",
    "data" : {
        "username":"test",
        "token":"whatever"
    }
}
"""

struct LoginResponse: Codable {
    let username: String
    let token: String
}

do {
    print(try JSONDecoder().decode(NetworkResponse<LoginResponse>.self, from: Data(loginResponse.utf8)))
} catch {
    print(error)
}

推荐阅读