用protocol 去聲明協(xié)議宅此。
protocol ExampleProtocol {
var simpleDescription: String { get }//表明屬性只讀
mutating func adjust()//表明這個方法可以修改屬性
}
一般情況下匪凉,值類型的實例方法不能修改它的屬性蔑赘。mutating(變異)加在方法前式矫,表示該方法可以修改屬性的值乡摹,還可以給它隱含的self屬性賦值一個全新的實例,這個新實例在方法結束后會替換原來的實例衷佃。
類趟卸,枚舉,和結構體都可以繼承協(xié)議氏义。
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {//類方法前不需要加mutating,因為類是引用類型
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
使用extension給已有的類型增加新的東西锄列,比如一個新方法和計算屬性。你可以用extension給別的地方聲明的類型或者甚至給你引進來的庫或框架的一個類型修改定義惯悠,使得這個類型遵循某個協(xié)議邻邮。
extension Int : ExampleProtocol {
var simpleDescription: String {
return "The number \(self)"
}
mutating func adjust() {
self += 42
}
}
print(7.simpleDescription)
你可以使用協(xié)議的名稱像其他命名類型一樣-比如,創(chuàng)建一個有不同類型都遵循一個協(xié)議的對象的集合克婶。當你使用一個是協(xié)議類型的常量或變量時筒严,定義在協(xié)議之外的方法不能調用丹泉。
let protocolValue: ExampleProtocol = a // a 是上面的SimpleClass()
print(protocolValue.simpleDescription)
print(protocolValue. anotherProperty) // 會報錯
盡管protocolValue是一個ExampleProtocol的動態(tài)類型,但是編譯器視它為ExampleProtocol類型鸭蛙。意味著除了遵循協(xié)議內的內容不能訪問類的方法和屬性摹恨。