协议能够*继承*一个或多个其他协议,可以在继承的协议的基础上增加新的要求。协议的继承语法与类的继承相似,多个被继承的协议间用逗号分隔:
protocol InheritingProtocol: SomeProtocol, AnotherProtocol {
// 这里是协议的定义部分
}
如下所示,PrettyTextRepresentable
协议继承了 TextRepresentable
协议:
protocol PrettyTextRepresentable: TextRepresentable {
var prettyTextualDescription: String { get }
}
例子中定义了一个新的协议 PrettyTextRepresentable
,它继承自 TextRepresentable
协议。任何遵循 PrettyTextRepresentable
协议的类型在满足该协议的要求时,也必须满足 TextRepresentable
协议的要求。在这个例子中,PrettyTextRepresentable
协议额外要求遵循协议的类型提供一个返回值为 String
类型的 prettyTextualDescription
属性。
如下所示,扩展 SnakesAndLadders
,使其遵循并符合 PrettyTextRepresentable
协议:
extension SnakesAndLadders: PrettyTextRepresentable {
var prettyTextualDescription: String {
var output = textualDescription + ":\n"
for index in 1...finalSquare {
switch board[index] {
case let ladder where ladder > 0:
output += "▲ "
case let snake where snake < 0:
output += "▼ "
default:
output += "○ "
}
}
return output
}
}
上述扩展令 SnakesAndLadders
遵循了 PrettyTextRepresentable
协议,并提供了协议要求的 prettyTextualDescription
属性。每个 PrettyTextRepresentable
类型同时也是 TextRepresentable
类型,所以在 prettyTextualDescription
的实现中,可以访问 textualDescription
属性。然后,拼接上了冒号和换行符。接着,遍历数组中的元素,拼接一个几何图形来表示每个棋盘方格的内容:
- 当从数组中取出的元素的值大于
0
时,用▲
表示。 - 当从数组中取出的元素的值小于
0
时,用▼
表示。 - 当从数组中取出的元素的值等于
0
时,用○
表示。
任意 SankesAndLadders
的实例都可以使用 prettyTextualDescription
属性来打印一个漂亮的文本描述:
print(game.prettyTextualDescription)
// A game of Snakes and Ladders with 25 squares:
// ○ ○ ▲ ○ ○ ▲ ○ ○ ▲ ▲ ○ ○ ○ ▼ ○ ○ ○ ○ ▼ ○ ○ ▼ ○ ▼ ○