我检查了similar question,但是在我的情况下出现的问题完全不同。

我正在使用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?'
ios - 在Swift 3中,Completion Block变为零-LMLPHP

最佳答案

问题是您忘记指定onCompletion的类型。使用onCompletion的声明,您还需要指定其类型为FetchFilesCompletionBlock

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

关于ios - 在Swift 3中,Completion Block变为零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44671215/

10-12 18:30