Swift。Protocol&Delegate隨筆

Yuwen Chiu
Swift。隨筆
Published in
5 min readJan 27, 2020

上一篇文章之後我就開始準備履歷和面試,最後很幸運的拿到了Offer也開始上班了!所以我的“心願記帳APP”可能會暫時(永遠?🤣)停更,等之後更穩定有餘裕時再繼續😳

上班將近一個月以來,我深刻感受到工作的實作和過去寫的程式完全是…天差地遠🤯很多觀念都處在一種“好像懂又好像不懂”的窘境,所以我想督促自己把這些模稜兩可的地方寫成文章,藉此讓自己複習和加深印象,但但但!我的內容不一定是最正確的,如果有任何錯誤歡迎大家留言給我🙏🏻今天就從Protocol&Delegate開始吧💪🏻

Protocol是什麼?Delegate又是什麼?

我會說Protocol是委託書,列了許多委託項目但沒有詳細內容,如果接受這份委託書就要把項目的內容列清楚並完成。也就是說,Protocol只宣告Function但沒有實作,如果遵從Protocol就要實作所宣告的Function。

Delegate是一種委託、代理的機制,它就像一個業務員,當客戶有問題時會委託業務員去處理。以TableView來說,使用Table時不知道要呈現什麼資訊,會委託DataSource和Delegate去找答案,得到答案才能建立成功。

通常用於Delegate機制的Protocol命名習慣會以Delegate為結尾。

不同物件之間的溝通方式

實際開發時,我們常常會在兩個物件之間傳遞資料和溝通,Delegate就是其中一種方式。當A物件需要接收B物件的資料來呈現畫面,或是通知B物件來回應A物件的動作時,就會替A物件宣告Protocol使用Delegate機制。我覺得簡單的解釋:A物件的某些職責委託B物件來完成=B物件代理A物件完成某些職責;A物件的動作通知B物件來回應=B物件回應A物件的動作。

❯❯❯ TableView(A)的DataSource和Delegate都指向了ViewController(B),TableView(A)需要從ViewController(B)接收幾個Section、幾個Row的資料才能如願呈現在畫面上。

TableView(A)獲取資料的職責委託ViewController(B)來完成=ViewController(B)代理了TableView(A)獲取資料的職責。

❯❯❯ 修改資料頁(A)的修改動作通知會員資料頁(B)來回應,所以替修改資料頁(A)宣告Protocol,修改資料頁(A)的修改結果傳遞給會員資料頁(B)之後,會員資料頁(B)會顯示相應的資料。

修改資料頁(A)的修改動作通知會員資料頁(B)顯示相應資料來回應=會員資料頁(B)顯示相應資料回應修改資料頁(A)的修改動作。

寫個程式來舉例

以上面所說的修改會員資料例子來練習。操作流程是從會員資料頁(B)進入修改資料頁(A)修改資料頁(A)的結果再回傳給會員資料頁(B),所以我將Delegate通知事件的特性理解為反向傳遞時使用。

【 從文字來看實作的 6 步驟 】

  1. 宣告A物件的Protocol // EditViewController.swift
  2. 宣告A物件的Property Delegate // EditViewController.swift
  3. 通知Delegate回應A物件的事件,執行Protocol所宣告的Function // EditViewController.swift
  4. B物件遵從A物件的Protocol // UserInfoViewController.swift
  5. B物件實作A物件的Protocol // UserInfoViewController.swift
  6. B物件設為A物件的代理人 // UserInfoViewController.swift

【 從程式來看實作的 6 步驟 】

A物件:EditViewController.swift

B物件:UserInfoViewController.swift

這次的Protocol&Delegate隨筆就先告一段落啦!雖然文章篇幅不算長,但我花了滿多時間才完成,除了當作自己的學習筆記,也希望可以幫助正在閱讀的你🤘🏻以上如果有任何錯誤或是建議歡迎大家留言給我~

有興趣可以取用我的檔案🙆🏻‍♀️

--

--