簡體   English   中英

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  {

    }
}

如何為成功消息參數創建通用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}
       }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM