【问题标题】:Cannot convert value of type '(Result<Model>) -> Void' to expected argument type '(Result<_>) -> Void'无法将类型 '(Result<Model>) -> Void' 的值转换为预期的参数类型 '(Result<_>) -> Void'
【发布时间】:2018-06-16 15:42:48
【问题描述】:

我收到此错误,不知道如何解决。即使试图澄清泛型类型似乎也不起作用。任何解决方案都会有所帮助,因为 Swift 编译器确实没有给我太多帮助。

这是我的功能:

public func request<T: JSONEncodable, K: JSONDecodable>(_ url: URLConvertible, httpMethod: HTTPMethod, query: [URLQueryItem]? = nil, body: T? = nil, completion: @escaping (Result<K>) -> Void) {
    do {
        var urlRequest = try buildURLRequest(httpMethod: httpMethod, url: url, withBase: baseURL, query: query, body: body)

        for middleware in requestMiddleware {
            try middleware.run(request: &urlRequest)
        }

        session.dataTask(with: urlRequest, completionHandler: { (data, urlResponse, error) in
            do {
                var data = data
                var urlResponse = urlResponse
                var error = error

                for middleware in self.responseMiddleware {
                    try middleware.run(data: &data, urlResponse: &urlResponse, error: &error)
                }

                if let error = error {
                    throw error
                } else if let data = data {
                    completion(.success(urlResponse as! HTTPURLResponse, try self.jsonDecoder.decode(K.self, from: data)))
                } else {
                    completion(.failure(HTTPClientError.nilResponseData))
                }
            } catch {
                completion(.failure(error))
            }
        }).resume()
    } catch {
        completion(.failure(error))
    }
}

结果枚举:

internal enum Result<T: JSONDecodable> {

    case success(HTTPURLResponse, T)
    case failure(Error)

}

我怎么称呼它:

httpClient.request("hi", httpMethod: .get, completion: { (result: Result<Model>) -> Void in
    switch result {
        case .success(httpURLResponse, value):
            print("nice")
        case .failure(error):
            print("nice")
    }
})

【问题讨论】:

  • 为什么不用Codable 而不是T: JSONEncodable, K: JSONDecodable

标签: ios swift xcode


【解决方案1】:

错误是因为body: T? = nil。编译器无法解析通用 T。您必须提供确认协议JSONEncodable 的正文。

举例

struct ExampleBody: JSONEncodable {

}

现在

let body: ExampleBody = Body()
httpClient.request("hi", httpMethod: .get, body:body, completion: { (result: Result<Model>) -> Void in
    switch result {
        case .success(httpURLResponse, value):
            print("nice")
        case .failure(error):
            print("nice")
    }
})

或者因为你只是将身体传递给buildURLRequest,你不需要T

public func request<K: JSONDecodable>(_ url: URLConvertible, httpMethod: HTTPMethod, query: [URLQueryItem]? = nil, body: JSONEncodable? = nil, completion: @escaping (Result<K>) -> Void) {
    //....
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多