記錄學習內容。
主要是看網路上大大的文章和影片,做些紀錄。
內容可能錯誤。
學習這部影片:
Swift Delegate Pattern
整理:
1
swift 的 protocol 類似 interface 、介面
2
用到Delegate Pattern 的常見地方:
tableView 的
tableView.dataSouce = self
tableView.delegate = self
collectionView 的
collectionView.dataSouce = self
collectionView.delegate = self
3
影片裡舉了一個例子,步驟:
一
創建一個介面 -- > Person介面有兩個方法 : 得到名字 和 得到年齡 。
二
然後創建一個類別 : Person類別
裡面有三個東西
一個變數 叫 delegate , 他是Person 介面創的 物件變數
(不太會形容,可能錯誤)
一個方法 叫印出名字 , 印出 delegate 的得到名字
一個方法 叫印出年齡 , 印出 delegate 的得到年齡
其實這個類別,就只是,創建一個介面變數,然後用介面變數的方法
三
所以 我們在ViewCotroller 就可以 先 implement interface ( protocol) 。
把 person 介面 ,先拿來implement ,接著完成
得到名字 和 得到年齡 的內容 。
之後創建一個Person類別的變數
然後 person.delegate = self
Self 就是 viewController.swift ,因為介面直接放到 viewController 類別 ,所以這樣用 ,可以直接把介面帶給 person.delegate。
所以就把 {人類介面}帶到{人類類別}了 。
4
所以在回到
tableView 的
tableView.dataSouce = self
步驟 ,也是類似 :
一 要先在 viewController.swift implement UITableViewDataSource 介面
二 完成 UITableViewDataSource介面 的 兩個 必填的方法 。
三 之後 tableView.dataSouce = self
這邊的 dataSouce 變數 就跟 Person 的delegate 變數 一樣 :
把{介面}丟給 {類別裡的一個介面變數} 。
5
觀察 原始碼 :
右鍵 -- > Jump To Definition
可以去看UITableView的源碼 ,會發現dataSource變數 :
weak open var dataSource: UITableViewDataSource?
再去看 UITableViewDataSource 源碼,會發現是一個protocol 介面 。
然後裡面有好幾個方法, 只有 兩個沒加optional,表示這兩個方法,一定要實作 。
想到了 C# 的 Delegate 。
https://ithelp.ithome.com.tw/articles/10229326
再回去複習C#的Delegate:
C# Delegates explained
C#的Delegate 是真的語法 ,而不是 design pattern (程式寫法)
一開始影片講了:
Delegate 是 a pointer of function,他可以指到function ,然後讓function執行。
但不是只有這個意思, 因為我直接讓function執行不就好了 ,為何要透過Delegate指到function去執行 ?
了解Delegate的字面意思:
Delegate 的英文翻譯 :
Delegate is a representative to communicate between two parties
Delegate 的意思 就是 代理人、中間人。
影片後來舉了一個例子 :
Delegate可以:
把一個funcion ,帶到另一個function,這才是主要用途
接著來看這篇文章:
.Net委派(delegate)的簡易解說與用法
作者大大的例子就是:
假設現在有1000個不同的人 ,要跟你借錢。
你對每個人的態度都不一樣,所以每個人都要分開處理。
所以可能會寫一個funtion長這樣:
Func 我對於借錢的反應 (amount , 人名)
{
If A
Return 借100
Elseif B
Return 借200
Elseif c
.Return 不借
.
.
// (1000個人 可能就有 好幾千行 的代碼)
}
所以解決方法就把每個人都當成一個funtion ,變成分開的1000個funtion ,不要集中在同一個funtion 。
變成:
Func a(int amount){
If amount >1000
Return 借100
Else
Return 借0
}
Func b(int amount){
Return 借200
}
Func c(int amount){
Return 不借
}
然後
就可以創建一個delegate 物件 ,用來把這些個別判斷的function 帶到 -- >
{我對於借錢的反應}funtion 。
變成:
Func 我對於借錢的反應 (amount , delegate_function)
{
String result = delegate_function(amount)
If result==不借
Return "掉頭就跑"
Else
Return result
}