JSON 解析后访问结构数据,Swift
Access struct data after JSON parse, Swift
我坚持以下几点:
我 运行 这个代码
AF.request(url, method: .get).responseDecodable(of: UserInfo.self) { response in
debugPrint(response)
}
然后我将 JSON 解析为这个结构:
struct UserInfo: Codable {
let totalCount: Int
let incompleteResults: Bool
let items: [Item]
enum CodingKeys: String, CodingKey {
case totalCount = "total_count"
case incompleteResults = "incomplete_results"
case items
}}
struct Item: Codable {
let id: Int
let userName: String
enum CodingKeys: String, CodingKey {
case id
case userName = "userName"
}}
例如,我如何访问用户名字段?
该结构在我的 class 之外,我想将其归档到另一个 .swift 文件
非常感谢!
您想要使用的是一个回调,将数据发送回调用 networkRequestFunction 的函数。
func makeRequest() {
someRequest(url: "thisURL") { (userInfo, error) in
guard let userInfo = userInfo else {
// present error
return
}
// Now you have your userStruct
print(userInfo)
}
}
func someRequest(url: String, callback: @escaping ((UserInfo?, AFError?) -> ())) {
AF.request(url, method: .get).responseDecodable(of: UserInfo.self) { response in
switch response.result {
case .success(let info):
// This is where i missed that you already had decoded it, no need to guard let here
callback(info, nil)
case .failure(let error):
callback(nil, error)
}
}
}
我坚持以下几点: 我 运行 这个代码
AF.request(url, method: .get).responseDecodable(of: UserInfo.self) { response in
debugPrint(response)
}
然后我将 JSON 解析为这个结构:
struct UserInfo: Codable {
let totalCount: Int
let incompleteResults: Bool
let items: [Item]
enum CodingKeys: String, CodingKey {
case totalCount = "total_count"
case incompleteResults = "incomplete_results"
case items
}}
struct Item: Codable {
let id: Int
let userName: String
enum CodingKeys: String, CodingKey {
case id
case userName = "userName"
}}
例如,我如何访问用户名字段?
该结构在我的 class 之外,我想将其归档到另一个 .swift 文件
非常感谢!
您想要使用的是一个回调,将数据发送回调用 networkRequestFunction 的函数。
func makeRequest() {
someRequest(url: "thisURL") { (userInfo, error) in
guard let userInfo = userInfo else {
// present error
return
}
// Now you have your userStruct
print(userInfo)
}
}
func someRequest(url: String, callback: @escaping ((UserInfo?, AFError?) -> ())) {
AF.request(url, method: .get).responseDecodable(of: UserInfo.self) { response in
switch response.result {
case .success(let info):
// This is where i missed that you already had decoded it, no need to guard let here
callback(info, nil)
case .failure(let error):
callback(nil, error)
}
}
}