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 {
}
}
如何为 success 和 message 参数创建通用的 Sturct。
您可以使代表网络响应的根结构成为通用的,这样您就可以使 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)
}
常用结构:
我创造了类似的东西
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}
}
在这里,我收到了我所有 api 的 API 回复。
{
"success" : true,
"message" : "",
"data" : {
/multipal data parameter/
}
}
这是我的可编码模型
struct Login: Codable {
let success: Bool
let message: String
let data: Data
struct Data: Codable {
}
}
如何为 success 和 message 参数创建通用的 Sturct。
您可以使代表网络响应的根结构成为通用的,这样您就可以使 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)
}
常用结构:
我创造了类似的东西
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}
}