Delegate(一):委派別人幫我做事情吧!

Murphy
Apr 16, 2024

--

iOS內建有許多Delegate委派機制的元件,最常見的應該就是TableView、CollectionView等,
但到底Delegate是什麼呢?

我們用文字來舉一個例子吧!

我養了隻貓咪,養貓咪最基本要做的事情就是餵食,所以我把這件事情當成養貓咪的基本條件

正常而言,我要餵食貓咪,但是平常上班時,貓咪也要吃飯啊!因此我買了自動餵食機來當代理人,幫我在家裡沒人時餵貓咪

所以,現在我只要通知餵食機該餵貓咪,餵食機就會掉出乾糧給貓咪吃

但還有一個情況,家裡有人時,我要請家人幫我餵貓咪乾糧或罐頭

這個故事有四個角色:
基本條件(餵食)、我、自動餵食機、家人
如果用程式的角度來講,餵食就是協定(Protocol)、我(Delegate委派者)、自動餵食機(被委派者,實際任務執行者)、家人(被委派者,實際任務執行者)

那我們用程式來寫看看這個例子。

//餵食的protocol:裡面有一個方法叫餵食
protocol FeedDelegate: AnyObject {

func feeding(_ : String)

}
//委派者:我,負責通知餵食機該餵貓囉
class Owner{

weak var delegate: FeedDelegate?

func feedingDryFood(){
self.delegate?.feeding("卡滋卡滋的乾乾")
}

func feedingCannedFood(){
self.delegate?.feeding("香噴噴的罐罐")
}
}
//自動餵食機:負責執行餵貓咪乾糧
class AutoFeeder: FeedDelegate{

let murphy = Owner()

func setDelegate(){
murphy.delegate = self
}

//實作feeding任務的內容
func feeding(_ food: String) {
print("自動餵食機正在餵食...")
print("貓貓這餐吃\(food)")
}
}
//家人:負責執行餵貓咪吃罐頭
class FamilyMember: FeedDelegate{

let murphy = Owner()

func setDelegate(){
murphy.delegate = self
}

//實作feeding任務的內容
func feeding(_ food: String) {
print("家人正在餵食...")
print("貓貓這餐吃\(food)")
}
}

讓我們用playground跑一次

自動餵食機成功幫我餵了貓咪乾乾
Dante也成功的幫我餵了貓貓乾乾跟罐罐

這個例子裡面很明顯地看出,我們可以藉由delegate來傳遞想傳遞的參數
也可以看出被委派的對象可以同時不止一個,
只要被委派的對象(AutoFeeder / FamilyMember)有去做代理委派者(Owner)的行為: 被委派者.delegate = self
被委派的對象就可以替委派者執行他所擁有的方法

--

--