Swift

Swift:Delegateって謎すぎない???


Delegateってマジで謎ですよね。

使用頻度がそこそこ高いのに、理解するのが難しいです。

最近ようやくしっくりする説明を思いついたので、メモしていきます。

 

俺とDelegate

私がSwiftを勉強し始めた時に買ったiOSアプリ開発の入門書で出てきたのが最初でした。

確か、UITextFieldDelegateだったと思います。(UITableViewDelegateだったかも・・・)

textFieldShouldReturnというreturnキーを押した時に処理されるメソッドを使いたくて、

UITextFieldDelegateを格闘したことは今でも鮮明に覚えています。

今ではすっかり友達です。

 

多くの方が私と同じタイミングでdelegateと出会ったのではないでしょうか。

その頃はめちゃくそ謎でしたが、写経&写経で乗り切ったのを覚えています。

 

Delegateってそもそも何?

Delegateとは、『代理人』という意味のある言葉です。

『イベントを通知するデザインパターンの一つ』と言えます。

上記のUITextFieldの例で考えると、

UITextFieldがreturnキーをタップされたこと(イベント)を感知して、

Delegate(代理人)に指定されているViewControllerが、textFieldShouldReturnメソッドを処理する。

という流れです。

うーん、謎ですね。

もっと身近な例

お使いを例に考えてみましょう。

Parent

どっちか一人に3時ごろにお使い頼むからね!

Child1

かしこまり!

Child2

ラジャー!

/

/

/

3時ごろ

Parent

Child1!お使い行ってこい!

Child1

かしこまり!

お使いを頼む:Parent

お使いを頼まれる可能性がある:Child1, Child2

『お使いに行ってきてね♡』という頼み:Ask

実際にお使いに行った:Child1

 

実際のコードではこのようになっています。

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プロトコルに準拠していなければいけません。

 

 

 

なんとなくイメージできましたか??

デリゲートの良いところは、

プロトコルを作成する際に実際の処理を書かず、

デリゲート先に任せることができる点です。

そう考えるとこの例はあまり良い例ではないかもしれません・・・


ABOUT ME
ささお
3年目iOSエンジニア。 スタートアップで働いておりやす。 プログラミングスクールとエンジニアのキャリアを考えたい。 作ったアプリ - https://apps.apple.com/us/app/loverprofile/id1463563845?l=ja&ls=1