在Swift中定义协议

use*_*435 1 delegates protocols ios swift

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

  1. protocol FooDelegate {}

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

  3. protocol FooDelegate: class {}

mat*_*att 7

我会以略微不同的顺序处理这些案件:

  1. 一个协议可以由枚举,结构或类采用.

  2. protocol FooDelegate: class {}意味着协议只能由一个类采用.

  3. @objc protocol FooDelegate {}将此协议暴露给Objective-C - Objective-C可以"看到"它.它还暗示(2),即现在这是一个类协议.

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

weak var delegate : MyDelegateProtocol
Run Code Online (Sandbox Code Playgroud)

你不能说weak除非这个东西是一个实例 - 不是结构或枚举(因为它们没有相同的内存管理).声明此协议为一类协议平静的编译器告诉它的恐惧,无论谁采用该协议在实际上是一个类.

你想要做的一个很好的例子(3)是你希望你的协议有可选成员.只有Objective-C才能做到这一点,因此您可以有效地将协议转换为Objective-C协议.当然,Swift会自动将Objective-C中定义的@objc协议视为协议.