首页 文章

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

提问于
浏览
2

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

我在 ViewController 类中重写了一个名为 navbarRightButtonAction(button:) 的方法 .

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 回答

  • 5

    @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
    }
    

相关问题