关于 Swift static override 是 final 的循环警告

Circular warnings about Swift static override being final

我有一个 NSDocumentController 子类需要知道它是否通过 NSWindowRestoration 协议恢复了任何 windows。

我覆盖的特定函数 documented here 是:

override open static func restoreWindow(withIdentifier identifier: NSUserInterfaceItemIdentifier, state: NSCoder, completionHandler: @escaping (NSWindow?, Error?) -> Void)

正如所写的那样,这个函数在我想要的时候被调用并且工作得很好。但是,我收到以下警告:

Static declarations are implicitly 'final'; use 'public' instead of 'open'

此警告包含一个看似有用的修复程序,可将 open 转换为 public。但是,当我接受时,我会收到此错误:

Overriding static method must be as accessible as the declaration it overrides

此错误提示我将 public 替换为 open

我已经就这种循环行为与 Apple 展开了密切接触。但是,我真的很想找到一种方法来消除这个警告。或者,也许还有另一种方法可以通知 NSDocumentController 子类它已恢复 windows.

要重现此错误,请使用 Xcode10 创建一个新的 App 项目,并包含以下代码。我只是在 AppDelegate 声明之后把它扔进去了。默认情况下,该项目配置 Swift 4.2 并为 macOS 10.14 构建。

class MyDocumentController: NSDocumentController {
    override open static func restoreWindow(withIdentifier identifier: NSUserInterfaceItemIdentifier, state: NSCoder, completionHandler: @escaping (NSWindow?, Error?) -> Void) {
        super.restoreWindow(withIdentifier: identifier, state: state, completionHandler: completionHandler)
    }
}

感谢上面的 Martin R link Swift 编译器中的问题。这个问题也有一个解决方法,确实为我解决了这个问题。

Fixing this is possible by actually using class instead of static in the override in class Y.