swift - 扩展 Document.close 的 completionHandler
问题描述
我想扩展 Document.close 函数,以便在调用用户传递给函数的 completionHandler 之前触发 completionHandler 时首先运行我自己的一些代码。所以是这样的:
override func close(completionHandler: ((Bool) -> Void)? = nil) {
super.close(completionHandler: { (success) in
// TODO: do something AFTER writeContents has completed
// TODO: call completionHandler
})
}
到目前为止一切顺利,但我无法调用传递给函数的 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 closure parameter,但我们无法更改函数定义,因为它覆盖了(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)
}
}
推荐阅读
- python-3.x - Keras model.predict 给出相同的值
- node.js - React JS:在 VS Code 中使用 npx 命令时出现 CREATE_REACT_APP 问题
- git - 如果某些文件被更改,是否可以只触发管道?
- ruby-on-rails - 渲染状态:200 使用 sidekiq 等后台作业
- python - 如何根据另一个数据框的值返回列中的值
- ios - 罕见的使用 Apple 登录崩溃
- postgresql - 调试高 PostgreSQL 内存使用率(每个连接)
- paypal - paypal onboard before payment 403 Forbidden 错误,问题:MISSING_SCOPES
- javascript - 覆盖默认 TabIndex 行为以首先选择选中的元素
- python - 如何在 pywebhfds 中通过连接错误?