我正在尝试将我的代码(用Swift 3编写)转换为Swift 4,因为我在需要的地方添加了@objc
。 Xcode在自动修复它们方面做得相当不错,但我正在努力解决一些问题(所有使用相同的2种方法),Xcode无法提供帮助,只需将@objc
放在我的代码中。< / p>
我在我的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
,但它也没有帮助
我不知道如何解决弃用警告。
答案 0 :(得分:7)
将@objc
或@nonobjc
放在extension
:
@objc extension PBViewController: PBNavigationBarDelegate
有关详细信息,请查看Swift Evolution的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
}