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

Chr*_*egg 0 handler swift swift3

我刚刚更新了一个正在运行的Swift 2到Swift 3程序,我收到了错误,

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

以下是相关细节(我希望):

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

completionHandler的函数:

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

GTMSessionFetcherCompletionHandler 在Objective-C头文件中定义,如下所示:

#define GTM_NULLABLE_TYPE __nullable
typedef void (^GTMSessionFetcherCompletionHandler)(NSData * GTM_NULLABLE_TYPE data,
                                               NSError * GTM_NULLABLE_TYPE error);
Run Code Online (Sandbox Code Playgroud)

我尝试将handleDownload()更改为以下内容:

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

但是这会将错误移动到这个函数:"无法转换类型'的返回表达式(数据?,NSError?) - > Void'返回类型'GTMSessionFetcherCompletionHandler?'"

我无法弄清楚如何保持curried(?)数据和错误变量,并让它编译.

Ham*_*ish 7

根据SE-0112,NSError现在作为Error协议桥接到Swift .事实上,如果你点击GTMSessionFetcherCompletionHandlerSwift中的类型,你会看到它是如何被桥接的:

typealias GTMSessionFetcherCompletionHandler = (Data?, Error?) -> Void
Run Code Online (Sandbox Code Playgroud)

因此,您只需更改自己handleDownload(_:)的签名即可反映:

func handleDownload(_ studentNum:Int) -> (Data?, Error?) -> Void {
    return { (data: Data?, error: Error?) -> Void in
        // code for function
    }
}
Run Code Online (Sandbox Code Playgroud)