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

Posted

技术标签:

【中文标题】Swift 2 到 Swift 3:无法将类型 \'(Data?, NSError?) -> Void\' 的值转换为预期的参数类型 \'GTMSessionFetcherCompletionHandler?\'【英文标题】:Swift 2 to Swift 3: Cannot convert value of type '(Data?, NSError?) -> Void' to to expected argument type 'GTMSessionFetcherCompletionHandler?'Swift 2 到 Swift 3:无法将类型 '(Data?, NSError?) -> Void' 的值转换为预期的参数类型 'GTMSessionFetcherCompletionHandler?' 【发布时间】:2016-09-16 17:37:08 【问题描述】:

我刚刚将一个正常工作的 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

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);

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

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

但这会将错误移至此函数:“无法将类型 '(Data?, NSError?) -> Void' 的返回表达式转换为返回类型 'GTMSessionFetcherCompletionHandler?'”

我不知道如何保留柯里化 (?) 数据和错误变量,并让它编译。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

我应该补充一下——这也影响了我代码的其他部分——我强迫一些代码使用 NSError,它导致了运行时错误。如果没有您的回应,我不会发现运行时错误。所以谢谢你! @ChrisGregg 乐于助人:)【参考方案2】:
  WORequestManager.shared().genericRequest(withMethod: "GET", webserviceName: walletAPI, andParameters: params, showLoading: true, success:  (responseDictionary: [AnyHashable: Any]?) in


        , failure:  (error: Error?) in

    )

【讨论】:

虽然这段代码 sn-p 可以回答这个问题,但它没有提供任何上下文来解释如何或为什么。考虑添加一两句话来解释你的答案。

以上是关于Swift 2 到 Swift 3:无法将类型 '(Data?, NSError?) -> Void' 的值转换为预期的参数类型 'GTMSessionFetcherCompletionHand的主要内容,如果未能解决你的问题,请参考以下文章

无法转换任何类型?要键入 AnyObject?从 swift 3 转换为 swift 4 时

从 Swift 2.3 -> 3.2 转换时,无法将 String 类型的值转换为指定类型 NSManagedObjectContext

Swift 4.1 - 无法将 [Character] 类型的值转换为 [String]

“无法将类型 'String' 的值分配给类型 'AnyObject?'”,Swift 3,Xcode 8 beta 6

Xcode 8.1 Swift 3 错误:无法将“String”类型的值转换为预期的参数类型“UnsafeMutableRawPointer”

Swift 新手,无法手动将 swift 2 转换为 swift 5