第二十一章 协议。
14. Optional Protocol Requirements (可选协议要求)
我们可以为协议定义一个可选的要求(optional requirement),这些要求可以勿需被所遵循的协议类型所实现,我们可以在协议的定义中以添加optional
修饰符作为前缀的方法作为这个协议的可选要求。当我们写的代码要与objective-c作交互的时候,要加上@objc
属性,需要注意的是@objc
协议只能被继承于Objective-c的类所采用或@objc
的类。而@objc
协议不能内结构体或枚举所采用。
当我们在可选要求中使用方法或属性的时候,它的类型会自动变成可选,举个例子,类型的方法由(Int) -> String
变成((Int) -> String)?
,需要注意的是整个函数类型将会包装在可选类型里面,而不是返回类型变成可可选的。在可选链里面可以调用这个可选协议要求,因为遵循协议的类型可能没有实现这些可选要求。类似someOptionalMethod?(someArgument)
这样,你可以在可选方法名称后加上 ?
来调用可选方法,详情见可选链章节。
@objc protocol CounterDataSource {
// 可选方法要求
@objc optional func increment(forCount count: Int) -> Int
// 可选属性要求
@objc optional var fixedIncrement: Int {
get }
}
上面的这个例子是定义了一个整数计数的类Counter
它使用外部的数据源来提供每次的增量。数据源由CounterDataSource
协议定义,包含两个可选要求
这个CounterDataSource协议定义了一个可选方法要求increment(forCount:)
和一个可选属性要求fixedIncrement
,这两个要求定义了两个不同的方法来为数据源提供一个Counter实例的合适的增量方法,
下例定义的是一个Counter类,它有两个类型为CounterDataSource?
的属性dataSource。
class Counter {
var count = 0
var dataSource: CounterDataSource?
func increment() {
if let amount = dataSource?.increment?(forCount: count) {
count += amount
} else if