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”