2016-09-16 97 views
0

我剛剛更新工作斯威夫特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(?)數據和錯誤變量,並進行編譯。

回答

6

按照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

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


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

    }) 
+0

儘管這段代碼可能會回答這個問題,但它沒有提供任何上下文來解釋如何或爲什麼。考慮增加一兩句話來解釋你的答案。 – brandonscript

相關問題