【问题标题】:Default protocol implementation causes 'does not conform to protocol' error默认协议实现导致“不符合协议”错误
【发布时间】:2018-01-12 13:50:49
【问题描述】:

我正在尝试将默认实现添加到我的委托方法之一。但是,在添加默认实现并从实现协议的类中删除方法后,我收到does not conform to protocol 错误。它适用于游乐场。

protocol NavigationDelegate: NSObjectProtocol {
    func didSetToolbarVisible(_ isVisible: Bool)
}
extension NavigationDelegate {
    func didSetToolbarVisible(_ isVisible: Bool) {
        print("Default implementation")
    }
}
class MyViewController: NavigationDelegate {
    // 'does not conform to protocol' error
}

我错过了什么?

【问题讨论】:

  • 我猜,来自NSObjectProtocol 的部分——如果你从NSObject 继承MyViewController 会发生什么?

标签: ios swift swift-protocols protocol-oriented


【解决方案1】:

一个类默认不符合NSObjectProtocol,导致错误。

改变

protocol NavigationDelegate: NSObjectProtocol

到

protocol NavigationDelegate: class

【讨论】:

  • 同样的错误。即使我做到了protocol NavigationDelegate {}
  • @nambatee 错误消息的确切文本是什么?
  • @thekman Type 'MyViewController' does not conform to protocol 'NavigationDelegate' Do you want to add protocol stubs?。我的MyViewController 继承自 Foo,后者继承自 Bar(符合基于 NSObjectProtocol 的其他 2 个协议),后者继承自 UIViewController(以防万一)
  • @nambatee 我在一个空项目中重新创建了相同的场景,它非常适合我。一定有其他原因导致错误。
【解决方案2】:

您的NavigationDelegate 使用NSObjectProtocol 的基本协议。这意味着任何符合NavigationDelegate 的东西也必须符合NSObjectProtocol。将您的类声明更改为以下内容: class MyViewController: NSObject, NavigationDelegate.

【讨论】:

    【解决方案3】:

    解决了!我的NavigationDelegate 及其扩展名与MyViewController 所属的目标不同。只需将扩展程序移动到同一目标即可。

    希望这对未来的人有所帮助?

    【讨论】:

    • 不要将协议扩展(即默认实现)移动到与符合协议的代码相同的目标,您可以将扩展及其方法设为“公共”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多