繁体   English   中英

扩展 Document.close 的 completionHandler

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM