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
被委派的對象就可以替委派者執行他所擁有的方法