在 Swift 中定义协议

Defining protocols in Swift

Swift中这三个协议定义有什么区别?

  1. protocol FooDelegate {}

  2. @objc protocol FooDelegate {} -- 这和protocol FooDelegate, NSObjectProtocol {}一样吗?

  3. protocol FooDelegate: class {}

我将以稍微不同的顺序处理案例:

  1. 枚举、结构或class可以采用协议。

  2. protocol FooDelegate: class {}表示这个协议只能被class.

    [=37=采用]
  3. @objc protocol FooDelegate {} 将此协议公开给 Objective-C - Objective-C 可以 "see" 它。它还意味着 (2),即现在这是一个 class 协议。

为什么要执行 (2) 的一个很好的例子是当您想要声明一个类型为协议的弱实例 属性 时:

weak var delegate : MyDelegateProtocol

你不能说 weak 除非这个东西是 class 实例 - 而不是结构或枚举(因为它们没有相同的内存管理)。将此协议声明为 class 协议可以平息编译器的恐惧,因为它告诉编译器采用此协议的人 实际上是 class.

您为什么要执行 (3) 的一个很好的例子是您希望您的协议具有可选成员。只有 Objective-C 可以做到这一点,因此您可以有效地将协议变成 Objective-C 协议。当然,Objective-C 中 定义的 协议会被 Swift 自动视为 @objc 协议。

添加到 matt 的回答中,

@objc protocol FooDelegate {} -- is this the same as protocol FooDelegate, NSObjectProtocol {}?

你是说protocol FooDelegate : NSObjectProtocol {}?不。它不会扩展 NSObjectProtocol,除非您明确声明它。