前言
在#30、#31中,已經提過了協定的基本功能,以及作為參數、委任模式的運作邏輯,本篇章會進一步提到的部分,是協定其餘延伸出來的功能,將藉由本篇章描述結束。
正文
1.協定可為型別集合
協定還有一些功能,比如說可以作為是一種集合,尤其是陣列或字典:

比如這個例子,我們在命名了一個SomeProtocol後,便做了一個類別、一個結構來引SomeProtocol這個協定進去使用,然後再分別把他們實體化。
基本的東西做完後,接著看到20行的地方,我們把someArray指為一種陣列,裡面包著協定型別,接著再讓它被指為陣列實體們。
接著走訪它,更可以藉由協定都通有的someFunction( )來呼叫兩者實體內部的函式。
2.協定繼承協定
協定另一個特性,就是它可以繼承其他協定:

大抵上可以說,它的這項功能跟類別是非常相似的,都是可以繼承其他協定的屬性或方法:

3.協定合成
假若今天你需要一個型別同時對多個協定遵守,你可以使用:「ProtocolName & ProtocolName」這樣的方式去描述你要帶進去的參數,而過去的協定合成用法:protocol<SomeProtocol, AnotherProtocol>
這種格式組已經廢置,所以實際的使用則如下:


(雖然沒有人在每天練胸的啦)
4.協定檢查
你可以使用前面章節提過的is
與as
來檢查是否符合某協定或是轉換到指定的協定型別,使用方式與型別檢查與轉換一樣:
is
用來檢查實體是否符合某協定,符合會返回true
,反之則返回false
。as?
返回一個可選值。當實體符合某協定時,會返回協定型別的可選值,反之則返回nil
。as!
將實體強制向下轉換到某協定型別,如果失敗則會引發運行時錯誤

上述大概分成幾個脈絡:
1–3行為基本的協定Human
5–13分別定義了兩個名稱不同,但卻內含協定Human的類別
15–18則是一個沒有Human協定的類別
20–23為宣告一個陣列為,陣列內含上述5–18提到的三個類別,並以AnyObject說明可以是任意型別
25–30走訪:如果協定檢查object含有Human這個協定,就成立,否則跳下到29的結果
當然,上述四個規則:協定可為集合型別、協定可以繼承協定、協定可以被合成、以及協定可以作為是一種檢查的方式。
這些都是基於協定的特性所延伸出來的細節,而當然,「可選」(Optional)也為協定提供了更多組合的可能性,但目前篇章還未提到可選鏈的概念,故先暫時將相關篇章往後延。轉而先描述跟「可選」相關的內容,我想會是對未來理解文章、理解程式碼上更有效的方式。