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

时间:2017-10-18 21:42:50

标签: ios swift swift4

我正在尝试将我的代码(用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,但它也没有帮助 我不知道如何解决弃用警告。

1 个答案:

答案 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
}