[英]Extend completionHandler of Document.close
我想扩展 Document.close function 以在完成处理程序触发时首先运行我自己的一些代码,然后再调用由用户传递给 function 的完成处理程序。 所以是这样的:
override func close(completionHandler: ((Bool) -> Void)? = nil) {
super.close(completionHandler: { (success) in
// TODO: do something AFTER writeContents has completed
// TODO: call completionHandler
})
}
到目前为止一切顺利,但我无法调用传递给 function 的 completionHandler。 使用completionHandler()
导致编译器抱怨Cannot call value of non-function type '((Bool) -> Void)?'
. 一些 StackOverflow 搜索之后听起来我们必须使用@escaping
注释:
override func close(completionHandler: @escaping ((Bool) -> Void)? = nil) {
super.close(completionHandler: { (success) in
// TODO: do something AFTER writeContents has completed
// TODO: call completionHandler
})
}
但编译器再次抱怨: @escaping attribute only applies to function types
。 这导致我们遇到其他问题,例如Swift 3 optional escaping 闭包参数,但我们无法更改 function 定义,因为它覆盖了(Objective--C)系统库。
我是不是误会了什么? 如果没有,有没有办法解决这个限制?
您可以通过以下完成,
class Document: UIDocument {
override func close(completionHandler: ((Bool) -> Void)? = nil) {
let completion: ((Bool) -> Void)? = { success in
print("I got \(success)")
// TODO: do something AFTER writeContents has completed
//....
//....
//....
// TODO: call completionHandler
completionHandler?(success)
}
super.close(completionHandler: completion)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.