使用“protocol”來聲明一個(gè)協(xié)議。
protocol ExampleProtocol {
? var simpleDescription: String { get }
? mutating func adjust()
}
類、枚舉和結(jié)構(gòu)體都可以實(shí)現(xiàn)協(xié)議。
class SimpleClass: ExampleProtocol {
? var simpleDescription: String = "A very simple class."
? var anotherProperty: Int = 69105
? func adjust() {
? ? simpleDescription += "? Now 100% adjusted."
? }
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol {
? var simpleDescription: String = "A simple structure"
? mutating func adjust() {
? ? simpleDescription += " (adjusted)"
? }
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
注意聲明“SimpleStructure”時(shí)候“mutating”關(guān)鍵字用來標(biāo)記一個(gè)會(huì)修改結(jié)構(gòu)體的方法钝吮。“SimpleClass”的聲明不需要標(biāo)記任何方法,因?yàn)轭愔械姆椒ㄍǔ漆羔?梢孕薷念悓傩?類的性質(zhì))。
使用“extension”來為現(xiàn)有的類型添加功能狱掂,比如新的方法和計(jì)算屬性演痒。你可以使用擴(kuò)展在別處修改定義,甚至是從外部庫或者框架引入的一個(gè)類型趋惨,使得這個(gè)類型遵循某個(gè)協(xié)議鸟顺。
extension Int: ExampleProtocol {
? var simpleDescription: String {
? ? return "The number \(self)"
? }
? mutating func adjust() {
? ? self += 42
? }
}
print(7.simpleDescription)
你可以像使用其他命名類型一樣使用協(xié)議名——例如,創(chuàng)建一個(gè)有不同類型但是都實(shí)現(xiàn)一個(gè)協(xié)議的對(duì)象 合器虾。當(dāng)你處理類型是協(xié)議的值時(shí)讯嫂,協(xié)議外定義的方法不可用。
let protocolValue: ExampleProtocol = a
print(protocolValue.simpleDescription)
// print(protocolValue.anotherProperty) // 去掉注釋可以看到錯(cuò)誤
即使“protocolValue”變量運(yùn)行時(shí)的類型是“simpleClass”兆沙,編譯器會(huì)把它的類型當(dāng)做“ExampleProtocol”欧芽。這表示你不能調(diào)用類在它實(shí)現(xiàn)的協(xié)議之外實(shí)現(xiàn)的方法或者屬性。