[Swift] Delegateが分からない初心者のための最後の受け皿

##今回作るもの

黄色のボタンを押すと画面が遷移され黄色くなる実装をdelegateを使って実装&説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/f143e745-29a8-6a60-6f7d-cea1a4818b95.png) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/2cfdf70b-8686-bca2-b072-fd09887a17f7.png)

##きっかけ

Swiftのdelegateの説明をQiitaでたくさん読みましたがいまいち理解できず、なんとなく実装していました。delegateで詰まることが多かったので、アウトプットの機会にしようと思います。

##対象

私のように他の記事を読んでも理解に苦しんだ方々に読んで頂きたいです。

##Delegateとは

Delegateは**委譲**という意味ですが、そのクラスではできないことを他のクラスでやってもらうため委譲が必要になるのです。
詳しくコードと共に見ていきましょう。

##実際のコード

3ファイル作成しました。
1つめははじめの画面のViewController
2つめは黄色画面遷移先のYellowViewController
3つめはViewControllerのCellのクラス(ButtonTableViewCell)

###まず1つ目のViewControllerです。
![スクリーンショット 0002-12-07 12.38.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/ae07c809-32c1-4743-6f99-cfe55ac6e6b5.png)
ここでは一枚目の黄色ボタンのViewの部分を作っています
###次に黄色画面遷移先のYellowViewControllerです
![スクリーンショット 0002-12-07 13.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/cb10c3d7-4881-0693-b0c3-34d11810e657.png)
黄色の画面にするViewの部分を作っています
###最後に先ほど作った黄色ボタンのCellのクラスです
![スクリーンショット 0002-12-07 13.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/aae5c709-d26f-6f78-970e-6d31539839ba.png)
ここではcellの中のボタンタップ時の処理を行えます。
「ここに処理を書きたい」の部分に

```swift
let yellowViewController = YellowViewController()
navigationController?.pushViewController(yellowViewController, animated: true)
```
を入れて黄色画面に飛ばしてやりたいですが、CellではNavigationControllerが使用できないので、他の画面で処理をする必要があるのです。そこでdelegateという考え方が必要になります。

###Delegateの使い方
1, protocolを宣言
2, delegateを宣言
3, 発火させたい場所にdelegate設置
4, 受け渡し先のクラスで継承
5, 受け渡し先のViewにdelegateを呼び出す
6, 処理を実装する

##具体的な実装方法
![スクリーンショット 0002-12-07 13.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/666b0af8-e46e-73a2-2705-b895a33739c6.png)
1, まずprotocolを発火させたい(ここでは@IBActionのあるButtonTableViewCell)クラスで宣言します。

```swift
protocol [delegate名]: class {
   func [メソッド名]
}
```
2, delegateを発火させたい(ここでは@IBActionのあるButtonTableViewCell)クラスで宣言します
3, 実際に発火させたい箇所(ここでは@IBActionの中)でdelegateを設置
4, ViewControllerに戻って、delegate名を継承する
5, ViewControllerでcellを使える場所で、delegateを呼び出す
6, そのままでは実際にしたい処理が書かれていないので、protocolで宣言したmethodをViewController内で書きます
##おまけ (元々あるDelegate)
ViewControllerにも元々

```swift
buttonTableView.delegate = self
buttonTableView.dataSource = self
```
と書かれていますが、これも同様に

```swift
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,
```
UITableViewDelegate, UITableViewDataSourceを継承しているからです。
その証拠に、
![スクリーンショット 0002-12-07 13.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/fbe35aa2-6952-c058-0389-3a6e6808e4ac.png)
UITableViewDelegateを右クリックして見てみましょう。
![スクリーンショット 0002-12-07 13.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/147e058d-0d51-2cbb-10b8-c88d4c222300.png)
protocolが宣言されている訳です。
ViewControllerでデフォルトでtableViewが使えていたのも理由があったのですね。

```swift

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    }
    
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    }
```

##最後に
最後まで読んでいただきありがとうございます。理解していただけたしょうか？
delegateはswiftを学習し始めで必ずと言っていいほど、詰まる箇所だと思います。
とても複雑に見えていましたが、根本を理解してみると簡単なものでした。