我检查了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?'
。
答案 0 :(得分:1)
问题是您忘记指定onCompletion
的类型。声明onCompletion
后,您还需要指定其类型为FetchFilesCompletionBlock
。
let onCompletion: FetchFilesCompletionBlock = {(file, error) in
//Your code
}
dataManager.fetchFile(param, onCompletion: onCompletion)
答案 1 :(得分:1)
问题是在块定义中你使用Error作为你的错误的类,但是在你创建的块中你使用了NSError,而它们符合它们并不是“隐式”铸造的,而是通过做Nirav提出的你“明确地“改变了差异(NSError为错误)