Swift之旅(六)協議與擴充

來源:互聯網
上載者:User

標籤: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之旅(六)協議與擴充

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.