在 Swift 中定义协议
Defining protocols in Swift
Swift中这三个协议定义有什么区别?
protocol FooDelegate {}
@objc protocol FooDelegate {}
-- 这和protocol FooDelegate, NSObjectProtocol {}
一样吗?
protocol FooDelegate: class {}
我将以稍微不同的顺序处理案例:
枚举、结构或class可以采用协议。
protocol FooDelegate: class {}
表示这个协议只能被class.
[=37=采用]
@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
,除非您明确声明它。
Swift中这三个协议定义有什么区别?
protocol FooDelegate {}
@objc protocol FooDelegate {}
-- 这和protocol FooDelegate, NSObjectProtocol {}
一样吗?protocol FooDelegate: class {}
我将以稍微不同的顺序处理案例:
枚举、结构或class可以采用协议。
[=37=采用]protocol FooDelegate: class {}
表示这个协议只能被class.@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
,除非您明确声明它。