【问题标题】:How can I conform to a protocol if a class has no superclass? [duplicate]如果一个类没有超类,我如何遵守协议? [复制]
【发布时间】:2015-12-18 14:29:50
【问题描述】:

我有一个想要遵守协议的控制器类(不是 viewController)。 这个控制器类不是任何其他类的子类,所以它没有超类。

如果一个类没有超类,我如何遵守协议?

这不起作用:

class xxxController , yyyDelegate

这不是我们想要的:

class xxxController : zzzSuperClasss, yyyDelegate

有人知道它在 Swift 2.1 中是如何工作的吗?

更新:

我忘了写我试过了:

class xxxController : yyyDelegate

当我这样做时,我得到

类型 xxxController 不符合协议 NSObjectProtocol

所以我猜 yyyDelegate 要求(在这种情况下)xxxController 是 NSObject 的子类?

【问题讨论】:

  • class xxxController : yyyDelegate ?
  • 您的编辑使您的问题重复:)
  • 完美,我去看看。

标签: swift delegates swift2 protocols


【解决方案1】:

如果一个类有一个超类,那么超类必须列在基础项目的首位。当类没有超类时,协议从第一项开始列出。

也就是说,如果没有zzzSuperClasss,那么你可以简单地写

class xxxController : yyyDelegate

Swift 意识到yyyDelegate 是一个协议,并且会按照您的预期行事。

Documentation 提供了此类的示例:

protocol FullyNamed {
    var fullName: String { get }
}
class Starship: FullyNamed {
    ...
    var fullName: String {
        return (prefix != nil ? prefix! + " " : "") + name
    }
}

【讨论】:

  • 当我这样做时,我得到“类型 xxxController 不符合协议 NSObjectProtocol”,所以我猜 yyyDelegate 要求(在这种情况下)xxxController 是 NSObject 的子类?
  • @B-Man 是的,当您收到该错误消息时,您需要扩展NSObject,即class xxxController : NSObject, yyyDelegate
  • 好的,谢谢我试试
  • 接受,因为是第一个回复完整答案的人。谢谢
【解决方案2】:

您可以通过直接声明一致性来做到这一点:

protocol Foo { }
class Bar: Foo { }

.. 或通过扩展(例如,如果您无法控制类实现,例如从某个库获取它的情况):

protocol Foo { }
class Bar { }
extension Bar: Foo { }

【讨论】:

    猜你喜欢
    • 2022-08-21
    • 2011-10-07
    • 2022-01-05
    • 2022-12-18
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多