Swift 2 Swift 3:无法将类型'(Data?,NSError?) - > Void'的值转换为期望的参数类型'GTMSessionFetcherCompletionHandler?'

问题描述:

我刚刚更新工作斯威夫特2斯威夫特3节目,而我得到的错误,Swift 2 Swift 3:无法将类型'(Data?,NSError?) - > Void'的值转换为期望的参数类型'GTMSessionFetcherCompletionHandler?'

无法将类型的值“(数据?NSError?) - >虚空”预期参数类型“GTMSessionFetcherCompletionHandler ?

下面是有关细节(希望):

let fetcher = GTMSessionFetcher(urlString:url) 
fetcher.authorizer = parentController.service.authorizer 
fetcher.beginFetch(completionHandler: handleDownload(studentNum)) 
             ^^^^ causing the error 

用于completionHandler功能:

func handleDownload(_ studentNum:Int) -> (Data?, NSError?) -> Void { 
    return { (data: Data?, error: NSError?) -> Void in 
     // code for function 
    } 
} 

GTMSessionFetcherCompletionHandler在一个Objective-C标题中定义的,如下所示:

#define GTM_NULLABLE_TYPE __nullable 
typedef void (^GTMSessionFetcherCompletionHandler)(NSData * GTM_NULLABLE_TYPE data, 
               NSError * GTM_NULLABLE_TYPE error); 

我试过改变韩dleDownload()以下:

func handleDownload(_ studentNum:Int) -> (GTMSessionFetcherCompletionHandler?) { 
    return { (data: Data?, error: NSError?) -> Void in 
     // code for function 
    } 
} 

但移动误差降到这个功能:“无法将类型的返回表达式‘(?数据?NSError) - >虚空’返回类型“GTMSessionFetcherCompletionHandler? “

我无法弄清楚如何保留curried(?)数据和错误变量,并进行编译。

按照SE-0112,NSError现在桥接到Swift作为Error协议。事实上,如果你 +点击在斯威夫特的GTMSessionFetcherCompletionHandler类型,你会清楚地看到它是如何桥接:

typealias GTMSessionFetcherCompletionHandler = (Data?, Error?) -> Void 

所以你只需要改变你的handleDownload(_:)的签名,以反映这一点:

func handleDownload(_ studentNum:Int) -> (Data?, Error?) -> Void { 
    return { (data: Data?, error: Error?) -> Void in 
     // code for function 
    } 
} 
+0

啊 - 我明白了。选项点击技巧也很好! –

+0

我应该添加 - 这也影响了我的代码的其他部分 - 我强迫一些代码使用NSError,并导致运行时错误。没有你的反应,我不会想出运行时错误。所以谢谢! –

+0

@ChrisGregg乐意帮忙:) – Hamish

WORequestManager.shared().genericRequest(withMethod: "GET", webserviceName: walletAPI, andParameters: params, showLoading: true, success: { (responseDictionary: [AnyHashable: Any]?) in 


     }, failure: { (error: Error?) in 

    }) 
+0

尽管这段代码可能会回答这个问题,但它没有提供任何上下文来解释如何或为什么。考虑增加一两句话来解释你的答案。 – brandonscript