覆盖实例方法表单扩展取决于'@objc'的弃用推断

Cod*_*dey 4 ios swift swift4

我正在尝试将我的代码(用Swift 3编写)转换为Swift 4,因为我@objc在需要的地方添加.Xcode已经做了相当不错的工作来自动修复它们,但我正在努力解决一些问题(所有使用相同的2种方法),Xcode无法帮助,它只是放在@objc我的代码中.

navbarRightButtonAction(button:)ViewController课堂上重写了一个这样的方法.

class ViewController: PBViewController {
    override func navbarRightButtonAction(button: PBAdaptiveButton) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我收到警告的地方:

Override of instance method 'navbarRightButtonAction(button:)' from extension of PBViewController depends on deprecated inference of '@objc'
Run Code Online (Sandbox Code Playgroud)

然后我认为问题是我们在PBViewController类中看起来像这样:

extension PBViewController: PBNavigationBarDelegate {
    func navbarRightButtonAction(button: PBAdaptiveButton) {
        print("Override this method")
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我补充说@objc func navbarRightButtonAction(button: PBAdaptiveButton)但没有帮助.
然后我查看了PBNavigationBarDelegate协议

protocol PBNavigationBarDelegate {
    func navbarRightButtonAction(button:PBAdaptiveButton)
}
Run Code Online (Sandbox Code Playgroud)

我补充说,@objc protocol PBNavigationBarDelegate但它也没有帮助.
我不知道如何修复弃用警告.

lea*_*nne 7

放在@objc@nonobjc在前面extension:

@objc extension PBViewController: PBNavigationBarDelegate
Run Code Online (Sandbox Code Playgroud)

看看限制@objc推理,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
}
Run Code Online (Sandbox Code Playgroud)