首页 > 解决方案 > 扩展 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)系统库。

我是不是误会了什么?如果没有,有没有办法解决这个限制?

标签: swift

解决方案


您可以通过以下完成,

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)
    }
}

推荐阅读