一個協(xié)議可由多個協(xié)議采用protocol<SomeProtocol, AnotherProtocol>這樣的格式進行組合,稱為協(xié)議合成(protocol composition)。
舉個例子:
protocol Named {
var name: String { get }
}
protocol Aged {
var age: Int { get }
}
struct Person: Named, Aged {
var name: String
var age: Int
}
func wishHappyBirthday(celebrator: protocol<Named, Aged>) {
println("Happy birthday \(celebrator.name) - you're \(celebrator.age)!")
}
let birthdayPerson = Person(name: "Malcolm", age: 21)
wishHappyBirthday(birthdayPerson)
// 輸出 "Happy birthday Malcolm - you're 21!
Named協(xié)議包含String類型的name屬性;Aged協(xié)議包含Int類型的age屬性。Person結(jié)構(gòu)體遵循了這兩個協(xié)議。
wishHappyBirthday函數(shù)的形參celebrator的類型為protocol<Named,Aged>??梢詡魅肴我?code style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 14px; padding: 0px 5px; color: rgb(199, 37, 78); background-color: rgb(248, 248, 248); white-space: nowrap; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; margin: 0px 2px; border: 1px solid rgb(234, 234, 234);">遵循這兩個協(xié)議的類型的實例
注意:協(xié)議合成并不會生成一個新協(xié)議類型,而是將多個協(xié)議合成為一個臨時的協(xié)議,超出范圍后立即失效。