gpt4 book ai didi

ios - 使用 Alamofire 解析 Codable 响应

转载 作者:搜寻专家 更新时间:2023-11-01 06:50:33 29 4
gpt4 key购买 nike

我使用的是 Alamofire 框架,但我不明白为什么下面的变量是空的。

json:

{
"ret": true,
"text": "Oke!",
"data": {
"email": “test@mail.com”,
"nev": "text",
"zip": "1234",
"city": "London",
"street": "text",
"phone": "5555555555",
"gdpr": "2"
}
}

用户数据根类.swift:

struct UserDataRootClass : Codable {

let data : UserDataData?
let ret : Bool?
let text : String?

enum CodingKeys: String, CodingKey {
case data = "data"
case ret = "ret"
case text = "text"
}

init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
data = try? UserDataData(from: decoder)
ret = try values.decodeIfPresent(Bool.self, forKey: .ret)
text = try values.decodeIfPresent(String.self, forKey: .text)
}

}

用户数据数据.swift:

struct UserDataData : Codable {

let city : String?
let email : String?
let gdpr : String?
let nev : String?
let phone : String?
let street : String?
let zip : String?

enum CodingKeys: String, CodingKey {
case city = "city"
case email = "email"
case gdpr = "gdpr"
case nev = "nev"
case phone = "phone"
case street = "street"
case zip = "zip"
}

init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
city = try values.decodeIfPresent(String.self, forKey: .city)
email = try values.decodeIfPresent(String.self, forKey: .email)
gdpr = try values.decodeIfPresent(String.self, forKey: .gdpr)
nev = try values.decodeIfPresent(String.self, forKey: .nev)
phone = try values.decodeIfPresent(String.self, forKey: .phone)
street = try values.decodeIfPresent(String.self, forKey: .street)
zip = try values.decodeIfPresent(String.self, forKey: .zip)
}

}

网络管理器.swift:

func postLogin(urlString: String, completion: @escaping (UserDataRootClass?) -> Void) {
Alamofire.request(urlString).response {
response in
guard let data = response.data else { return }
do {
let decoder = JSONDecoder()
let loginRequest = try decoder.decode(UserDataRootClass.self, from: data)
completion(loginRequest)
} catch let error {
print(error)
completion(nil)
}
}
}

登录 View Controller .swift:

let networkManager = NetworkManager()
networkManager.postLogin(urlString: "http://demo.com") { (loginRequest) in

if((loginRequest?.ret)!) {
print(loginRequest) // -> for log
print(loginRequest?.data.phone)
}

}

日志:

UserDataRootClass(data: Optional(.UserDataData(gdpr: nil, email: nil, zip: nil, nev: nil, phone: nil, city: nil, street: nil)), ret: Optional(true), text: Optional("Oke!"))

loginRequest?.retloginRequest?.text 很好,但是 loginRequest?.data.email, loginRequest ?.data.zip... 为空 (nil)

最佳答案

类型变量名称与api 响应中的 json 键。例如,在您的情况下,您已将所有变量(在 UserDataRootClassUserDataData 内)命名为与其各自的 json 键相同,因此您可以删除这些枚举.

struct UserDataData : Codable {

let city : String?
let email : String?
let gdpr : String?
let nev : String?
let phone : String?
let street : String?
let zip : String?
}

struct UserDataRootClass : Codable {

let data : UserDataData?
let ret : Bool?
let text : String?
}

此外,您不需要实现 init(from decoder: Decoder) throws { 直到您必须对任何属性进行一些自定义。

关于ios - 使用 Alamofire 解析 Codable 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57652688/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com