Swift 4 Codable: общая структура для всех моделей - PullRequest
0 голосов
/ 25 сентября 2018

Здесь я получаю ответ 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 для успеха и сообщения параметра.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Общая структура:

My common struture of model

Я создал нечто подобное

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}
       }
0 голосов
/ 25 сентября 2018

Вы можете сделать корневую структуру, представляющую общий ответ сети, это позволит вам сохранять части 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)
}
...