冒号后带有“类”的协议? [复制]

Posted

技术标签:

【中文标题】冒号后带有“类”的协议? [复制]【英文标题】:protocol with "class" after the colon? [duplicate] 【发布时间】:2017-12-17 10:46:10 【问题描述】:

谁能解释一下下面的协议语法:

protocol AddItemViewControllerDelegate: class 
  func addItemViewControllerDidCancel(_ controller: AddItemViewController)
  func addItemViewController(_ controller: AddItemViewController,
                     didFinishAdding item: ChecklistItem)

“类”是做什么的?

【问题讨论】:

【参考方案1】:

这意味着该协议只能被类采用。所以没有任何结构或枚举可以采用这个协议。

仅类协议

您可以将协议采用限制为类类型(而不是结构或 枚举)通过将 AnyObject 协议添加到协议的 继承列表。

protocol SomeClassOnlyProtocol: AnyObject, SomeInheritedProtocol 
    // class-only protocol definition goes here

在上面的例子中,SomeClassOnlyProtocol 只能被类类型采用。它的 编写结构或枚举定义的编译时错误 尝试采用 SomeClassOnlyProtocol。

注意

当该协议定义的行为由该协议定义时,请使用该协议 要求假定或要求符合的类型具有引用 语义而不是值语义。有关参考和价值的更多信息 语义,请参阅结构和枚举是值类型和类 是引用类型。

参考:Swift Programming Language - Protocols

【讨论】:

谢谢。在 Apple 的 Swift 语言 guide 中,似乎没有任何关于为此目的使用“类”的内容。在protocol section 中,该指南提到为此目的使用 AnyObject。 @7stud:你是对的,我认为在该文档的早期版本中他们使用了class 关键字。目的是一样的,但不知道为什么要更改关键字。将对此进行研究:) 您引用的参考文献中没有提到: class。似乎 Apple 更改了文档(比较这个较旧的答案:***.com/a/32118452/1187415 来自链接到重复的目标)。 – 请参阅 ***.com/questions/30176814/… 了解为什么(显然)相同。 @MartinR:我读过 Apple Swift 以前的文档,因为他们使用了 class 而不是 AnyObject(我清楚地记得这一点)。感谢您提供第二个链接,我现在对此有了清晰的认识。

以上是关于冒号后带有“类”的协议? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Swift 协议

Swift 协议

Swift 协议

为啥要扩展类而不是遵循协议? [复制]

BSD开源协议

drbd配置简述