2017-06-21 66 views
0

我查了similar question,但問題發生在我的情況是完全不同的。我使用typealias來避免重寫類似的完成塊聲明。完成塊成爲零在雨燕3

typealias FetchFilesCompletionBlock = (_ files: OPFiles?, _ error: Error?) -> Void 

在函數定義中,我使用的是可選類型FetchFilesCompletionBlock。儘管函數被調用了一個完成塊,但在函數體中,onCompletion變爲零。

func fetchFile(_ param: [String: String]? = nil, onCompletion: FetchFilesCompletionBlock?) { 
    // I found onCompletion is nil here. 
    // function body 
} 

fetchFile(_: onCompletion:)被稱爲如下:

let onCompletion = {(files, error) in 
    DispatchQueue.main.async(execute: {[weak self]() in 
    self?.onCompletion(files, error: error) 
    }) 
} as? FetchFilesCompletionBlock 
// Here also I found that onCompletion is nil 
dataManager.fetchFile(param, onCompletion: onCompletion) 

如果我從上面的代碼中刪除as? FetchFilesCompletionBlock,我得到了一個編譯時錯誤Cannot convert value of type '(OPFiles?, NSError?) ->()' to expected argument type 'FetchFilesCompletionBlock?'enter image description here

回答

1

問題是你忘了指定onCompletion的類型。在聲明onCompletion時,您還需要指定其類型爲FetchFilesCompletionBlock

let onCompletion: FetchFilesCompletionBlock = {(file, error) in 
    //Your code 
} 
dataManager.fetchFile(param, onCompletion: onCompletion) 
+0

謝謝@Nirav,它運作良好。你能說出背後的原因嗎? –

+1

@MilanKamilya歡迎隊友:),我已經寫過你沒有指定'onCompletion'類型的聲明是這個問題。 –

+0

請問你能告訴'as?有什麼區別嗎? FetchFilesCompletionBlock'&'let onCompletion:FetchFilesCompletionBlock' –

1

問題是,在該塊定義你用錯誤作爲你的錯誤的類,但在該塊你創造你使用NSError代替,而他們r符合他們r不「含蓄」澆注成型,並做什麼Nirav建議你「明確」鑄造的區別(NSError錯誤)

+0

這是正確的。感謝@HusseinDimessi進行深入檢查。 –

+0

'let onCompletion = {(files:OPFiles?,error:Error?)in }' - 同樣的原因也解決了這個問題。 –

+0

只是在錯誤結束時刪除s?這裏;) 但是,這將解決它出於同樣的原因 –