[英]Completion Block becomes nil in Swift 3
我檢查了類似的問題 ,但是在我的情況下發生的問題完全不同。
我正在使用typealias
來避免重寫類似的完成塊聲明。
typealias FetchFilesCompletionBlock = ( _ files: OPFiles?, _ error: Error?) -> Void
在函數定義中,我使用的是FetchFilesCompletionBlock
的可選類型。 即使使用完成塊調用該函數,在函數體中的onCompletion也變為nil。
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
從上面的代碼片段中獲取了as? FetchFilesCompletionBlock
,我遇到了編譯時錯誤Cannot convert value of type '(OPFiles?, NSError?) -> ()' to expected argument type 'FetchFilesCompletionBlock?'
。
問題是您忘記指定onCompletion
的類型。 使用onCompletion
的聲明,您還需要指定其類型為FetchFilesCompletionBlock
。
let onCompletion: FetchFilesCompletionBlock = {(file, error) in
//Your code
}
dataManager.fetchFile(param, onCompletion: onCompletion)
問題是,在塊定義中,您使用Error作為錯誤的類,但是在創建的塊中,您使用NSError,盡管它們符合標准,但並未“隱式”強制轉換,並且通過執行Nirav建議您“明確”強制轉換差異(NSError到Error)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.