簡體   English   中英

在Swift 3中,Completion Block變為零

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM