標籤:swift
使用 protocol 來定義一個協議。
protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust()}
類、枚舉和結構體都可以接受協議。
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.simpleDescriptionstruct SimpleStructure: ExampleProtocol { var simpleDescription: String = "A simple structure" mutating func adjust() { simpleDescription += " (adjusted)" }}var b = SimpleStructure()b.adjust()let bDescription = b.simpleDescription
試一試
寫一個遵循該協議的枚舉。
注意SimpleStructure裡使用了 mutating 關鍵字標記了一個修改結構體的方法。SimpleClass的定義裡不需要任何方法標記為mutating,因為類中的方法總是會修改這個類的。
使用 extension 來為已經存在的類增加功能,比如新方法和計算過的屬性。你可以用 extension 給那些定義在別的地方的類型增加協議遵循,甚至可以加到匯入的類庫或者架構的類型中。
extension Int: ExampleProtocol { var simpleDescription: String { return "The number \(self)" } mutating func adjust() { self += 42 }}println(7.simpleDescription)
試一試
為Double類型寫一個擴充,增加一個 absoluteValue 屬性。
你可以像其它任何命名類型那樣使用協議名——例如,要建立一個對象集合,對象的類型都不一樣,不過都遵循一個單獨的協議。當遇到類型為協議類型的值時,協議定義以外的方法是停用。
let protocolValue: ExampleProtocol = aprintln(protocolValue.simpleDescription)// println(protocolValue.anotherProperty) // 取消注釋看看會有什麼錯誤
即使變數 protocolValue 運行時類型是 SimpleClass,編譯器還是把它當作給定的 ExampleProtocol 類型。這說明除了協議裡定義的,你沒法訪問到類實現的方法和屬性。
Swift之旅(六)協議與擴充