我收到 API 的响应,但无法取回电子邮件数组,我做错了什么? 我尝试添加
DispatchQueue.main.asyn { emails.append(result.data.email) }
但结果相同。
// MARK: - Response Class
struct Response: Codable {
let data: DataClass
let support: Support
}
// MARK: - DataClass
struct DataClass: Codable {
let id: Int
let email, firstName, lastName: String
let avatar: String
enum CodingKeys: String, CodingKey {
case id, email
case firstName = "first_name"
case lastName = "last_name"
case avatar
}
}
// MARK: - Support
struct Support: Codable {
let url: String
let text: String
}
let urls = [
URL(string: "https://reqres.in/api/users/1"),
URL(string: "https://reqres.in/api/users/3"),
URL(string: "https://reqres.in/api/users/10")
]
func getEmailFromAPI(urls: [URL?]) -> [String] {
var emails: [String] = []
for url in urls {
URLSession.shared.dataTask(with: URLRequest(url: url!)) { data, response, error in
guard let data = data else { return }
guard let result = try? JSONDecoder().decode(Response.self, from: data) else { return }
print(result.data.email)
emails.append(result.data.email)
}.resume()
}
return emails
}
print(getEmailFromAPI(urls: urls))
请告诉我我做错了什么。
由于异步操作,“返回电子邮件”语句将在数组加载数据之前执行。
因此您可以使用闭包来传递电子邮件,如下所示
func getEmailFromAPI(urls: [URL?], emailResult: @escaping ([String]?) -> Void) {
var emails: [String] = []
for url in urls {
URLSession.shared.dataTask(with: URLRequest(url: url!)) { data, response, error in
if error != nil {
emailResult(nil)
}else {
guard let data = data else { return }
print(result.data.email)
emails.append(result.data.email)
emailResult(emails)
}
}.resume()
}
}
建议 - 宁愿不附加电子邮件操作,而是为其创建一个可编码对象