我查了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?'
。
謝謝@Nirav,它運作良好。你能說出背後的原因嗎? –
@MilanKamilya歡迎隊友:),我已經寫過你沒有指定'onCompletion'類型的聲明是這個問題。 –
請問你能告訴'as?有什麼區別嗎? FetchFilesCompletionBlock'&'let onCompletion:FetchFilesCompletionBlock' –