我正在学习本教程,但得到了以下错误:
上下文闭包类型‘(数据?、URLResponse?、错误?) -> Void’需要3个参数,但在闭包体中使用了1
在线:urlSession.dataTask(with: url) { (result)  in
private func fetchResources<T: Decodable>(url: URL, completion: @escaping (Result<T, APIServiceError>) -> Void) {
    guard var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
        completion(.failure(.invalidEndpoint))
        return
    }
    let queryItems = [URLQueryItem(name: "api_key", value: apiKey)]
    urlComponents.queryItems = queryItems
    guard let url = urlComponents.url else {
        completion(.failure(.invalidEndpoint))
        return
    }
    urlSession.dataTask(with: url) { (result)  in
        switch result {
            case .success(let (response, data)):
                guard let statusCode = (response as? HTTPURLResponse)?.statusCode, 200..<299 ~= statusCode else {
                    completion(.failure(.invalidResponse))
                    return
                }
                do {
                    let values = try self.jsonDecoder.decode(T.self, from: data)
                    completion(.success(values))
                } catch {
                    completion(.failure(.decodeError))
                }
            case .failure(let error):
                completion(.failure(.apiError))
            }
     }.resume()
}发布于 2021-01-11 05:13:04
dataTask的闭包需要三个参数,一个Data?、一个URLResponse?和一个Error?。您的代码编写得好像这个闭包只有一个参数,一个Result。看起来你以为那是Result<(Data, URLResponse), Error>,但事实并非如此。这个Result枚举是我们在自己的代码中使用的,但是URLSession没有使用它。
因此,将dataTask更改为使用包含以下三个参数的闭包:
private func fetchResources<T: Decodable>(url: URL, completion: @escaping (Result<T, APIServiceError>) -> Void) {
    guard var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
        completion(.failure(.invalidEndpoint))
        return
    }
    urlComponents.queryItems = [URLQueryItem(name: "api_key", value: apiKey)]
    guard let url = urlComponents.url else {
        completion(.failure(.invalidEndpoint))
        return
    }
    urlSession.dataTask(with: url) { data, response, error in
        guard error == nil else {
            completion(.failure(.apiError))
            return
        }
        guard 
            let data = data,
            let response = response as? HTTPURLResponse,
            200...299 ~= response.statusCode 
        else {
            completion(.failure(.invalidResponse))
            return
        }
        do {
            let values = try self.jsonDecoder.decode(T.self, from: data)
            completion(.success(values))
        } catch {
            completion(.failure(.decodeError))
        }
    }.resume()
}https://stackoverflow.com/questions/65660586
复制相似问题