【发布时间】:2018-05-31 05:57:48
【问题描述】:
我遇到了无法解决的类型推断错误。我在下面附上了最重要的sn-p。解析过程由APIClient中的Decoder单独完成。
为什么APIClient 的execute 不能识别T 是[Chapter],因为completion(Result.success(decodedData)) 具有这种类型?
func loadFeed(completion: @escaping (Result<[Chapter]>) -> Void) {
APIClient.shared.execute(APIRequest.loadFeed) { response in
guard let decodedData = response.decodedData else { return }
completion(Result.success(decodedData))
}
}
上面的 sn-p 是我在 Services 类中调用 APIClient 的方式。
class APIClient: APIClientProtocol {
static let shared = APIClient()
func execute<T: Decodable>(_ apiRequest: APIRequestDefining,
responseDecoder: ResponseDecoder = .jsonDecoding,
completionHandler: @escaping (Response<T>) -> Void) {
var response = Response<T>(request: request, httpResponse: dataResponse.response, data: dataResponse.data)
do {
try responseDecoder.decode(response: &response)
} catch {
response.error = error
}
completionHandler(response)
}
}
public struct Response<T> {
var decodedData: T?
}
enum Result<Value> {
case success(Value)
case failure(Error)
}
编辑:
澄清一下,下面的 sn-p 是我 decode 对推断对象的原始响应的位置和方式。
struct JSONResponseDecoder: ResponseDecoding {
func decode<T: Decodable>(response: inout Response<T>) throws {
guard let data = response.data else { return }
do {
try response.decodedData = JSONDecoder().decode(T.self, from: data)
} catch {
throw(ApplicationError(errorType: .decodingError))
}
}
}
编辑!!!!:
我发现了一件很奇怪的事情,我把guard的那行去掉了,一切正常,这是为什么呢?
【问题讨论】:
-
编译器从哪里推断类型?该类型在呼叫站点没有其他用途。
-
@Avi 没有
completion(Result.success(decodedData))做这项工作?我想它会匹配decodedData到[Chapter]。 -
连接完全在您的脑海中。代码中没有任何内容将外部
loadFeed()调用的特化与对execute()的调用联系起来。Result<T>与Response<T>的类型并不完全相同。
标签: ios swift networking callback type-inference