Swift中这三个协议定义之间有什么区别?
protocol FooDelegate {}
@objc protocol FooDelegate {}
- 这与protocol FooDelegate, NSObjectProtocol {}
相同吗?
protocol FooDelegate: class {}
答案 0 :(得分:7)
我将以稍微不同的顺序处理案件:
协议可以由枚举,结构或类采用。
protocol FooDelegate: class {}
表示此协议只能由班级采用。
@objc protocol FooDelegate {}
将此协议暴露给Objective-C - Objective-C可以“看到”它。它还暗示(2),即现在这是一个类协议。
你想要做的事情(2)的一个很好的例子是你想要声明一个类型为协议的弱实例属性:
weak var delegate : MyDelegateProtocol
你不能说weak
,除非这是类实例 - 不是结构或枚举(因为它们没有相同的内存管理)。将此协议声明为类协议可以通过告诉使用此协议的任何人实际上是一个类来平息编译器的恐惧。
你想要做的原因(3)的一个很好的例子是你希望你的协议有可选成员。只有Objective-C才能做到这一点,因此您可以有效地将协议转换为Objective-C协议。当然,Objective-C中的协议定义被Swift自动视为@objc
协议。
答案 1 :(得分:1)
要添加到matt的答案,
@objc protocol FooDelegate {} - 这与协议相同 FooDelegate,NSObjectProtocol {}?
你的意思是protocol FooDelegate : NSObjectProtocol {}
?不会。除非您明确声明,否则它不会延伸NSObjectProtocol
。