完成块在 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)
我检查了
我正在使用 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)