Delegateってマジで謎ですよね。
使用頻度がそこそこ高いのに、理解するのが難しいです。
最近ようやくしっくりする説明を思いついたので、メモしていきます。
Udemyのオススメの講座
Contents
俺とDelegate
私がSwiftを勉強し始めた時に買ったiOSアプリ開発の入門書で出てきたのが最初でした。
確か、UITextFieldDelegateだったと思います。(UITableViewDelegateだったかも・・・)
textFieldShouldReturnというreturnキーを押した時に処理されるメソッドを使いたくて、
UITextFieldDelegateを格闘したことは今でも鮮明に覚えています。
今ではすっかり友達です。
多くの方が私と同じタイミングでdelegateと出会ったのではないでしょうか。
その頃はめちゃくそ謎でしたが、写経&写経で乗り切ったのを覚えています。
Delegateってそもそも何?
Delegateとは、『代理人』という意味のある言葉です。
『イベントを通知するデザインパターンの一つ』と言えます。
上記のUITextFieldの例で考えると、
UITextFieldがreturnキーをタップされたこと(イベント)を感知して、
Delegate(代理人)に指定されているViewControllerが、textFieldShouldReturnメソッドを処理する。
という流れです。
うーん、謎ですね。
もっと身近な例
お使いを例に考えてみましょう。
/
/
/
3時ごろ
お使いを頼む:Parent
お使いを頼まれる可能性がある:Child1, Child2
『お使いに行ってきてね♡』という頼み:Ask
実際にお使いに行った:Child1
実際のコードではこのようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
protocol Ask {//頼み func goOtsukai()//頼むこと(お使いに行け!) } class Parent { weak var delegate: Ask!//頼みを持っている func say() { print("おーい、お使い行ってきてー") delegate.goOtsukai() } } class Child1: Ask { //Parentに頼まれた依頼を承認している。 func goOtsukai() { print("行ってまいります、母上!") } } class Child2: Ask { //Parentに頼まれた依頼を承認している。 func goOtsukai() { print("行ってまいります、母上!") } } let myParent = Parent() let myChild1 = Child1() myParent.delegate = myChild1 //お使いに行ってもらう子供をChild1に指定。 myParent.say() //お使いを頼む |
protocol
protocol:プロトコル、議定書、手順、覚書,etc
という意味のある言葉です。つまり”約束事”ですね。
delegateでは、議定書という言葉がしっくりきます。
議定書とは、取り決めが書かれた文書です。
上の例では、『goOtsukai関数』という関数を実装することを取り決められた議定書が『Ask』です。
Childクラス
ChildクラスはAskプロトコルに準拠しています。
準拠しているというのは、
Askプロトコルに書かれた取り決めを守る!!!。。。ということです。
myParent.delegate = myChild1
ここで実際にお使いに行くChildを決めています。
ここで決められたchldは、Askプロトコルに準拠していなければいけません。
なんとなくイメージできましたか??
デリゲートの良いところは、
プロトコルを作成する際に実際の処理を書かず、
デリゲート先に任せることができる点です。
そう考えるとこの例はあまり良い例ではないかもしれません・・・
コメント