Swift Review#33[協定Protocols-型別集合、協定繼承、協定合成、協定檢查]

--

前言

在#30、#31中,已經提過了協定的基本功能,以及作為參數、委任模式的運作邏輯,本篇章會進一步提到的部分,是協定其餘延伸出來的功能,將藉由本篇章描述結束。

正文

1.協定可為型別集合

協定還有一些功能,比如說可以作為是一種集合,尤其是陣列或字典:

比如這個例子,我們在命名了一個SomeProtocol後,便做了一個類別、一個結構來引SomeProtocol這個協定進去使用,然後再分別把他們實體化。

基本的東西做完後,接著看到20行的地方,我們把someArray指為一種陣列,裡面包著協定型別,接著再讓它被指為陣列實體們。

接著走訪它,更可以藉由協定都通有的someFunction( )來呼叫兩者實體內部的函式。

2.協定繼承協定

協定另一個特性,就是它可以繼承其他協定:

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

3.協定合成

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

(雖然沒有人在每天練胸的啦)

4.協定檢查

你可以使用前面章節提過的isas來檢查是否符合某協定或是轉換到指定的協定型別,使用方式與型別檢查與轉換一樣:

  • 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)也為協定提供了更多組合的可能性,但目前篇章還未提到可選鏈的概念,故先暫時將相關篇章往後延。轉而先描述跟「可選」相關的內容,我想會是對未來理解文章、理解程式碼上更有效的方式。

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

影山小麥機
影山小麥機

Written by 影山小麥機

本職為Mobile工程師,熱愛分享視野,也樂意站在ChatGPT的肩膀上。訂閱小麥機,收割技術、職涯、人生的難題。

No responses yet

Write a response