完成块在 Swift 3 后变为零

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,则会出现编译时错误 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 作为错误的 class ,但在您创建的块中,您使用了 NSError ,虽然它们是兼容的,但它们不是 "implicitly" 铸造的,并按照 Nirav 的建议 "explicitly" 进行了区分(NSError 到 Error)