Ios 回调中的类型推断错误
我有一个无法解决的类型推断错误。我在下面附上了最重要的片段。解析过程由Ios 回调中的类型推断错误,ios,swift,networking,callback,type-inference,Ios,Swift,Networking,Callback,Type Inference,我有一个无法解决的类型推断错误。我在下面附上了最重要的片段。解析过程由APIClient中的解码器独立完成 为什么APIClient的执行不识别t是[章节]作为行完成(Result.success(decodedata))具有该类型 编辑: 为了澄清,下面的代码片段是我将原始响应解码到推断对象中的位置和方式 struct JSONResponseDecoder: ResponseDecoding { func decode<T: Decodable>(response: i
APIClient
中的解码器独立完成
为什么APIClient
的执行不识别t
是[章节]
作为行完成(Result.success(decodedata))
具有该类型
编辑:
为了澄清,下面的代码片段是我将原始响应解码到推断对象中的位置和方式
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))
}
}
}
struct JSONResponseDecoder:ResponseDecoding{
func解码(响应:inout响应)抛出{
guard let data=response.data else{return}
做{
尝试response.decodedData=JSONDecoder().decode(T.self,from:data)
}抓住{
抛出(ApplicationError(错误类型:。解码错误))
}
}
}
编辑!!!!:强>
我发现了一件非常奇怪的事情,我用防护装置
移除了线路,一切正常,为什么
之前:
之后:
您的completionHandler
使用泛型类型的参数,因此在闭包中使用您的类型显式,否则它无法推断类型:
func loadFeed(completion: @escaping (Result<[Chapter]>) -> Void) {
APIClient.shared.execute(APIRequest.loadFeed) { (chapters: [Chapter]) -> () in
guard let decodedData = chapters.decodedData else { return }
completion(Result.success(decodedData))
}
}
func加载提要(完成:@escaping(Result)->Void){
中的APIClient.shared.execute(apirest.loadFeed){(章:[章]->()
guard let decodedata=chapters.decodedata else{return}
完成(结果成功(解码数据))
}
}
您说过,“execute不承认T是[章节]”,我想知道您为什么这么想
您有一个loadFeed函数,其中包含一个使用泛型类型章节的完成块
然后您有一个泛型类型为T的execute方法。当您调用execute方法时,它对类型Chapter一无所知
示例,其中我得到与您相同的错误:
func execute<T>(completionHandler: @escaping (T) -> Void) {
}
self.execute { (result) in
}
func执行(completionHandler:@escaping(T)->Void){
}
self.execute{(结果)在
}
解决方案是强制转换参数,以便可以推断T。就你而言:
func execute<T>(completionHandler: @escaping (T) -> Void) {
}
self.execute { (result:[Chapter]) in
}
func执行(completionHandler:@escaping(T)->Void){
}
self.execute{(结果:[章节])在
}
仿制药令人惊讶:)我通过另一篇文章找到了答案
错误的原因是编译器仅在闭包中有一条语句时引用闭包返回类型
编译器从何处推断类型?该类型在呼叫站点上没有其他用途。@Avi不completion(Result.success(decodedata))
做这项工作吗?我想它会把解码数据
与[章节]
匹配起来。这种联系完全在你的头脑中。代码中没有任何东西将外部loadFeed()
调用的专门化与对execute()
的调用连接起来Result
与Response
的类型不尽相同。您能否解释一下,为什么在我的实现中,completion(Result.success(decodedata))
行不能推断completion:@escaping(Result
T是[章节]
。这样,响应
就知道了它自己是如何被推断出来的。告诉我T
在哪里变成了[章节]
?@crom87说得很好:“……你有一个带有泛型T的execute方法。当你调用execute方法时,它对Chapter类型一无所知。”嗨,我更新了我的问题,你能看一下吗?我的答案是一样的,让你的类型明确。嗨,我更新了我的问题,你能看一下吗?
func execute<T>(completionHandler: @escaping (T) -> Void) {
}
self.execute { (result) in
}
func execute<T>(completionHandler: @escaping (T) -> Void) {
}
self.execute { (result:[Chapter]) in
}