【給iOS新手】Delegate是啥?能吃嗎?
iOS好像不管寫哪裡都有Delegate的存在,
Delegate丟進字典裡,就翻譯成"委託",
需要你用"物件導向"的思考方式,你可以先參考:【給程式新手】陰魂不散的物件導向
Delegate打個比喻,
就是"保險業務員",顧客需要的時候,不自己找答案,把這件事"委託"給"業務員"
顧客跟業務員的關係,也是有事才來找,找的時候還要先看業務員自己有沒有雇用(你有指定),顧客也可以輕易地換業務員,關係相當薄弱,所以大部份都是用assign, weak描述,Swift都用?來表示關係不確定。
舉個例子:
UITableView 需要知道有幾個Cell的時候,會去問dataSource,dataSource有在,才有答案可以顯示。
詳細點說明,這是種DesignPattern叫Adapter。
Adapter,去搜尋你會搜到很多變壓器的結果,就用變壓器比喻,
把A端的資訊,轉化成B端可以了解的資訊,
所以UITableView需要建置Table的時候,才會去問dataSource跟delegate一堆資訊,
delegate的實作者,就是你,就要把你的資料,轉成他指定的方式給他,
他才知道要怎麼做,
Delegate也可以用來"通知"事件的發生(顧客發現有問題當然要去找業務員),
比如說,登入頁面的登入狀態要讓別的物件得知,你可以設計一個Protocol,
讓其他物件可以實作這個Protocol,來得知登入的狀態。
Objective C:
/// 弄個Protocol給Delgate @protocol LoginStateChangeSwift:@optional - (void)userIsLogin; @end /// 實作 @interface CatchLoginStateObj : NSObject @end @implementation CatchLoginStateObj - (void)userIsLogin { // Do something. } @end /// 登入的ViewController,注意Delegate是用weak @interface LoginViewController : UIViewController @property (nonatomic, weak) NSObject *delegate; @end @implementation LoginViewController - (void)notifyDelegateStateChange { if (self.delegate && [self.delegate respondsToSelector:@selector(userIsLogin)]) { [self.delegate userIsLogin]; } } @end
/// 弄個Protocol給Delgate protocol LoginStateChange { func userIsLogin() } /// 實作 struct CatchLoginStateObj: LoginStateChange { func userIsLogin() { // Do something. } } /// 登入的ViewController,注意Delegate是用? class LoginViewController: UIViewController { var delegate: LoginStateChange? func notifyDelegateStateChange() { self.delegate?.userIsLogin() } }
了解後寫起來就挺容易的不是?
參考:
JWorld@TW - Design Patterns 入門 - 配接器(Adapter)
https://www.javaworld.com.tw/jute/post/view?bid=44&id=27545&sty=1&tpg=1&age=0
留言
張貼留言