实例方法窗体扩展的覆盖取决于不推荐使用的'@objc'推理
问题描述:
我想将我的代码(写入Swift 3)转换为Swift 4,为此我在需要时添加@objc
。 Xcode在自动修复它们方面做得相当不错,但我正在努力处理一些(全都使用相同的两种方法),Xcode无法提供帮助,它只是在我的代码中放置@objc
。实例方法窗体扩展的覆盖取决于不推荐使用的'@objc'推理
我重写了一个名为navbarRightButtonAction(button:)
的方法,就像在我的ViewController
类中一样。
class ViewController: PBViewController {
override func navbarRightButtonAction(button: PBAdaptiveButton) {
...
}
}
这是我得到警告说:
Override of instance method 'navbarRightButtonAction(button:)' from extension of PBViewController depends on deprecated inference of '@objc'
后来我想这个问题我们是在PBViewController
类,看起来像这样:
extension PBViewController: PBNavigationBarDelegate {
func navbarRightButtonAction(button: PBAdaptiveButton) {
print("Override this method")
}
}
所以我添加@objc func navbarRightButtonAction(button: PBAdaptiveButton)
但它没有帮助。
然后我看着PBNavigationBarDelegate
协议
protocol PBNavigationBarDelegate {
func navbarRightButtonAction(button:PBAdaptiveButton)
}
我加@objc protocol PBNavigationBarDelegate
但它并没有帮助。
我没有其他想法如何解决弃用警告。
答
将@objc
或@nonobjc
在extension
的面前:
@objc extension PBViewController: PBNavigationBarDelegate
在Limiting @objc
Inference, SE-0160看看雨燕进化的更多细节。它包含关于扩展下面的例子:
启用/分机内禁止@objc推断
有可能是代码的某些地区对所有的(或无)的入口点应该是暴露于Objective-C。允许在扩展名上指定@objc或@nonobjc。 @objc或@nonobjc将应用于该扩展没有自己的@objc或@nonobjc注释的任何成员。例如:
class SwiftClass { }
@objc extension SwiftClass {
func foo() { } // implicitly @objc
func bar() -> (Int, Int) // error: tuple type (Int, Int) not
// expressible in @objc. add @nonobjc or move this method to fix the issue
}
@objcMembers
class MyClass : NSObject {
func wibble() { } // implicitly @objc
}
@nonobjc extension MyClass {
func wobble() { } // not @objc, despite @objcMembers
}
感谢它的工作。我想我以前也试过这个,但是这次我清理了我的项目(cmd + shift + k),然后运行。 – Codey