关于 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.
我有一个 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.