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
 }