如何在 Swift Playground 中不获取空数组?

问题描述 投票:0回答:1

我收到 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))

请告诉我我做错了什么。

ios swift nsurlsession
1个回答
0
投票

由于异步操作,“返回电子邮件”语句将在数组加载数据之前执行。

因此您可以使用闭包来传递电子邮件,如下所示

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()
        }
    }

建议 - 宁愿不附加电子邮件操作,而是为其创建一个可编码对象

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.