Swift 4 Codable:所有模型的通用结构

Swift 4 Codable : Common struct for all model

在这里,我收到了我所有 api 的 API 回复。

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

这是我的可编码模型

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

    struct Data: Codable  {

    }
}

如何为 successmessage 参数创建通用的 Sturct

您可以使代表网络响应的根结构成为通用的,这样您就可以使 successmessage 部分在所有专用响应之间保持通用。

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)
}

常用结构:

我创造了类似的东西

struct statusModel<T:Codable>: Codable {

    let message : String
    let resultData : [T]?
    let status : Int

    enum CodingKeys: String, CodingKey {
        case message = "message"
        case resultData = "resultData"
        case status = "status"
    }
}

常规模型(resultData)

struct modelInitialize : Codable {

    let profileimgurl : String?
    let projecturl : String?

    enum CodingKeys: String, CodingKey {
        case profileimgurl = "profileimgurl"
        case projecturl = "projecturl"
    }
}

您可以如下设置

    do {
        guard let reponseData = responseData.value else {return} //Your webservice response in Data
        guard let finalModel = try?JSONDecoder().decode(statusModel<modelInitialize>.self, from: reponseData) else {return}
       }