协议可以通过扩展来为遵循协议的类型提供属性、方法以及下标的实现。通过这种方式,你可以基于协议本身来实现这些功能,而无需在每个遵循协议的类型中都重复同样的实现,也无需使用全局函数。
例如,可以扩展 RandomNumberGenerator
协议来提供 randomBool()
方法。该方法使用协议中定义的 random()
方法来返回一个随机的 Bool
值:
extension RandomNumberGenerator { func randomBool() -> Bool { return random() > 0.5 } }
通过协议扩展,所有遵循协议的类型,都能自动获得这个扩展所增加的方法实现而无需任何额外修改:
let generator = LinearCongruentialGenerator() print("Here's a random number: \(generator.random())") // 打印 “Here's a random number: 0.37464991998171” print("And here's a random Boolean: \(generator.randomBool())") // 打印 “And here's a random Boolean: true”
协议扩展可以为遵循协议的类型增加实现,但不能声明该协议继承自另一个协议。协议的继承只能在协议声明处进行指定。
提供默认实现
可以通过协议扩展来为协议要求的方法、计算属性提供默认的实现。如果遵循协议的类型为这些要求提供了自己的实现,那么这些自定义实现将会替代扩展中的默认实现被使用。
注意
通过协议扩展为协议要求提供的默认实现和可选的协议要求不同。虽然在这两种情况下,遵循协议的类型都无需自己实现这些要求,但是通过扩展提供的默认实现可以直接调用,而无需使用可选链式调用。
例如,PrettyTextRepresentable
协议继承自 TextRepresentable
协议,可以为其提供一个默认的 prettyTextualDescription
属性来简单地返回 textualDescription
属性的值:
extension PrettyTextRepresentable { var prettyTextualDescription: String { return textualDescription } }
注:
1.协议,可以继承协议,也可以扩展系统自带协议。
2.默认实现:协议只是制定标准接口,不能写具体实现,但可在扩展中写属性和方法的实现。