協議定義了某一批所要遵循的規範,但不關心類的內部狀態資料,也不關心類方法的實現細節。它只規定類中必須提供的方法。類、結構體、枚舉通過提供協議所要求的方法,屬性的具體實現來採用協議。 任意能夠滿足協議要求的類型被稱為協議的遵循者。 這種讓規範和實現分離的方式正是協議的好處,一種松耦合的設計。 swift中協議的作用,就相當於其他語言中的作用。 協議可以要求遵循者體統特定的執行個體屬性、執行個體方法、類方法、操作符或者下標等。
協議的定義方式: (跟類、結構體、枚舉的定義類似)
protocol SomeProtocol { // 協議內容 }
|
結構體遵循協議 在類型後面加上冒號:再加上協議名稱即可實現協議。實現多個協議是,各協議中間用逗號,隔開。
struct SomeStructure: FirstProtocol, AnotherProtocol { // 結構體內容 }
|
類遵循協議 同結構體,但是如果一個類在含有父類的同時也採用了協議,應當把父類放在所有協議之前。
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol { // 類的內容 }
|
對屬性的規定: 協議可以規定其遵循者提供特定名稱與類型的
執行個體屬性或
類屬性。無論其實儲存還是計算型屬性。此外還可以制定屬性是唯讀還是可讀寫的。 如果協議要求屬性可讀寫 -> 此屬性不能是常量儲存型或者唯讀計算型屬性; 如果協議要求屬性唯讀 -> 此屬性是儲存型或計算型都可以滿足協議。
協議規定執行個體屬性
protocol SomeProtocol { var musBeSettable : Int { get set }/*var 聲明變數屬性,含有執行個體要求的協議 *聲明後的{ get set }表示可讀寫 *{ get }表示唯讀 */ var doesNotNeedToBeSettable: Int { get } }
|
協議規定類屬性
protocol AnotherProtocol { class var someTypeProperty: Int { get set }//class首碼代表該屬性為類成員,在枚舉和結構體中實現協議時,需要使用上static關鍵字作為其首碼 }
|
對方法的規定: 協議可以要求它的遵循者實現某些特定的實力方法或者類方法。這些方法作為協議的一部分,直接將方法放在協議的定義中,不需要大括弧及其方法體。 協議中
類方法定義與
類屬性定義相似。
protocol SomeProtocol { class func someTypeMethod()//在協議方法前置關鍵字class來表示,在枚舉和結構體匯總實現方法時,需要使用static首碼來代替 }
|
協議中執行個體方法的定義
protocol RandomNumberGenerator { func random() -> Double } //RandomNumberGenerator協議並不在意傳回值是怎麼產生的,它只強調了產生一個Double類型值 |
介紹完協議的方法、屬性的定義規定之後,簡要地提一下面向Swift協議編程的其他特性。
對突變方法的規定 如果有時候需要更改執行個體中的所屬類型。在基於實值型別(結構體、枚舉)的執行個體方法中,將mutating關鍵字作為函數的首碼,寫在func前面,表示可以在該方法中修改執行個體及其屬性的所屬類型。 如果執行個體中的執行個體方法打算改變其遵循者執行個體的類型,那麼在執行個體定義時需要在方法前加mutating關鍵字,才能使結構體、枚舉來採用並滿足協議對方法的規定。
協議類型 儘管協議本身並不實現任何功能,但是協議可以被當做類型來使用。 三種使用情境: 協議類型作為函數、方法或者構造器中的參數類型或傳回值類型。 協議類型作為常量、變數或屬性的類型。 最為數組、字典或其他容器中的元素類型
委託(代理)模式 委託是一種允許類或者結構體將一些需要它們負責的功能委託其他類型的執行個體的設計模式。 委託模式的實現:定義協議來封裝那些需要被委託的函數和方法,使其遵循者擁有這些被委託的方法。
在擴充中添加協議成員 可以通過擴充來擴充已存在的類型(比如類、結構體、枚舉等等)。擴充可以為已存在的類型添加屬性、方法、下標、協議等成員。
需要注意的是,通過擴充已存在的類型遵循協議時,該類型的所有執行個體隨之添加協議中的屬性、方法、下標、協議等成員。
通過擴充補充協議聲明 當一個類型已經實現了協議中的所有要求,卻沒有聲明時,可以通過擴充來補充協議聲明。
集合中的協議類型 協議類型可以被集合使用,表示集合中的元素均為協議類型。
協議的繼承 協議能夠繼承一到多個其他協議。文法與類的繼承相似,多個協議間用逗號,分隔
協議的合成 一個協議可以由多個協議採用 protocol<SomeProtocol, AnotherProtocol>這樣的格式進行組合,稱為協議合成
檢驗協議的一致性 使用is和as操作符來檢查協議的一致性或轉化協議類型。
對可選協議的規定 可選協議中含有可選成員,其遵循者可以選擇是否實現這些成員。在協議中使用@optional關鍵字作為首碼來定義可選成員。 你可以在可選方法名稱後面,像someOptionalMethod?(someArgument)這樣,來檢查該方法時候被實現。可選方法和可選屬性都會返回一個可選值,當其不可訪問時,?之後的語句不會執行,並整體返回nil。