【給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 LoginStateChange 

@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
Swift:
/// 弄個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()
    }
}

了解後寫起來就挺容易的不是?可惡,Objective C好麻煩.... 


參考:
JWorld@TW - Design Patterns 入門 - 配接器(Adapter)
https://www.javaworld.com.tw/jute/post/view?bid=44&id=27545&sty=1&tpg=1&age=0

留言

這個網誌中的熱門文章

【給程式新手】陰魂不散的物件導向?

【教學】Facebook SDK 首部曲:登入Facebook(這是我的一小步...卻是人類...咦?這麼多人啊?)

【教學】Facebook SDK 前傳:準備Social一下