猿がもがきまくって理解したSwiftのデリゲート（Delegate）という仕組み

iOSの勉強を始めて少し経つと、たいていの人は大きな山に遭遇する。

それが**Delegate**（デリゲート）だ。

いろんな人たちが**このDelegateという山をより分かりやすく説明できないものか**と挑んできたが、意外とまだ登りやすいルートは見つかっていないような気がする。

もしかしたら人間は、猿だった頃の記憶を瞬く間に失ってしまうのかもしれない。

幸い僕は運よく（残念ながら）今でも猿なので、Delegateに遭遇した時の、

###**「Delegateってそもそも一体なんなんだ！」**
<br>

と思っていた気持ちと、

訳が分からなくて、もがいていた頃の記憶が鮮明に残っている。 
<br>

あの頃僕が（猿が）七転八倒しながらようやく分かった（気がする）Delegateというものについて説明してみたい。

---
結論から言うと、

###**デリゲートというのは一言で言えば「仕組み」だ**。  
<br>

どんな仕組みかというと**「クラス同士が連絡を取り合う仕組み」**
<br>

きっと今「デリゲートってなんなんだー！」と思っている人たちの多くは、UIKitのDelegateに遭遇しているのではないだろうか？

**UITableViewDelegate**
**UITextFieldDelegate**

とか。

**デリゲートっていうのはクラス同士が連絡を取り合う仕組み**だと知った上で、「こいつらは何なのか？」と考えると、こういうことになる。
<br>

１つ目のUITableViewDelegateは
**「テーブルビューが他のクラスと連絡を取るための仕組み」**で、

２つ目のUITextFieldDelegateも同様に、
**「テキストフィールドが他のクラスと連絡を取るための仕組み」**である。

<br>

---

今回はUITextFieldDelegateを例にして説明してみたい。


何も載せてない画面にテキストフィールドを載せるとこうなる。
<img width="943" alt="スクリーンショット_2017-03-11_9_42_17.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/2b9fd9d9-6ea9-ebf6-4004-2b4d41b12941.png">

**テキストフィールドがViewControllerのプロパティになっている。**
（ctrlキーを押しながらstoryboardのテキストフィールドをコードの中にドラッグした）

**ViewControllerは**、プロパティであるテキストフィールドに**直接連絡できる**。

こんな風に。
<img width="884" alt="スクリーンショット_2017-03-11_10_10_06.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/622cbf9a-af8e-770b-64f5-d8771b21360f.png">

<img width="788" alt="スクリーンショット 2017-03-11 10.27.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/338050f6-bf45-5fd1-fe1c-41536072acd0.png">



しかし**逆の場合**はどうだろう？

こうなる。
<img width="800" alt="スクリーンショット 2017-03-11 10.32.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/e5f6256c-e2b9-0267-6445-de401ce85012.png">

テキストフィールドはviewControllerをプロパティに持ってないので、
**連絡方法がない**。

###そこでデリゲートの登場である。
<br>

この状況下で**テキストフィールドがviewControllerに連絡を取るための仕組み**がUITextFieldDelegateである。

こんな風に書いて連絡をする。
<img width="1018" alt="スクリーンショット_2017-03-11_11_03_15.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/de1670af-96eb-c80a-ac65-b0ebb88e5ae4.png">

よくデリゲートの説明に出てくる**「３つの呪文」**と言うやつだ。
<img width="1062" alt="スクリーンショット_2017-03-11_11_06_17.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/a7d1842e-1171-8b25-318d-93371245e16b.png">
<br>

デリゲートという仕組みはこんな風に使うのだ。

---
<br>

ちなみにここではUITextFieldDelegateを使って**テキストフィールドから受け取れる連絡メソッドを１つだけしか載せていないが**、テキストフィールドから受け取れる連絡は、ユーザが編集を開始した時（textFieldDidBeginEditing）以外にも色々ある。
<img width="1027" alt="スクリーンショット 2017-03-11 11.12.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/45467/f119e6e5-69e1-382e-79ef-c423bafa0b85.png">
全部で８個？

ここに載っているデリゲートメソッドには、どれも**optional**（「オプションだから使っても使わなくてもいいよ」という意味）とついているので、**使いたい連絡方法だけを選んでコードに記述すればいい**。

※（UITextFieldのデリゲートメソッドは全てoptionalだが、他のデリゲートの仕組みではoptionalが付いてないこともある。その場合は必ず書かなければいけない連絡方法ということなので、書く必要がある）
<br>

---

これでデリゲートという仕組みの猿的理解による説明は以上です。

<br>

少しは**「デリゲートって一体何なんだ！！」**という気持ちが収まったでしょうか？
<br>

今回は「デリゲートってそもそも何なのよ？」というところにフォーカスしたかったので、UIKitのデリゲートの説明を中心にやりましたが、

この**Delegateという仕組みは自分で作ることもできます**。
<br>

例えば自分でUIViewのカスタマイズクラスを作ってViewControllerに載せた場合、**自作のクラスにはDelegateは標準装備されてません**ので、自作クラスからviewControllerに連絡を取る方法がありません。

そんな場合には自分でDelegateを作ってしまえばいいのです。
<br>

機会があればそのやり方についても猿流でお伝えしたいと思います。

最後まで読んでいただいてありがとうございました。