見出し画像

【Swift】【初心者用】世界一わかりやすいDelegateについて②

はいどうも!

フリーランスエンジニアの南だいすけです!


今回はみなさんが必ずハマるであろう、

Delegateについて前回の記事の続きとして説明していきたいと思います。

あくまで前回の記事の続きなので、

重複が嫌な方はprotocolで作成したDelegateからみたDelegateから

読んでみてください!


これ、過去に説明したextensionとも非常に相性がいいので、

まだの方は一緒に確認してみてください!


また今回も分かりやすさ重視で説明しているので、

もっと深いところは別のコンテンツで勉強することをおすすめします。


Delegateとは

よくDelegateはデザインパターンです!とか、

Delegateは移譲する!なんていいますが、

これだと全くわからないと思います。。


かくいう僕もそうでした。。


Delegateって実態がよく分からないので理解しにくいんですよ。

なので今回はあえて二つに分けて説明したいと思います。


protocolで作成したDelegateからみたDelegate

前回はtableViewに必要なDelegateを追加して、

tableViewの機能を使えるようにしました!

今回はprotocolというのを使って、

自分で Delegateを作ってみたいと思います。

なのではじめにprotocolについて説明します!


protocolとは

protocolとは具体的な処理内容は書かず、

クラスや構造体が実装するプロパティとメソッドを定義する機能

なんてよく言われています。


分かりにくいので分かりやすくざっくり簡単に説明すると、

tableViewを作る際にextensionするUITableViewDataSourceを

自分で作るようなイメージです!

あれってextensionに記載した際、

すぐにエラーになってFixを押すと勝手に関数が追加されますよね?

それで必要な情報なので関数の中を書いていくと。。

あれです!あのシステムを自分で作っていきます。


難しく聞こえますが、

書き方さえわかってしまえば楽勝なので頑張っていきましょう!


protocolのメリット

一緒にメリットの話しておきます。

1番のメリットは実装を後から変更することができると言うことです!

どう言うことかと言うと、

例えばtableViewがあってデータの処理はtableViewがしており、CellはカスタムCellにしていたとしましょう。

カスタムCellの中にButtonを配置しており、ButtonをタップするとWebViewに遷移するとします。

ここでButtonの処理はCell内でしたいと思います。


しかしあくまでそのカスタムCellは、

Cellなのであまり余計な情報を持ちたくありません。


その場合はprotocolを使ってデータを繋ぐのが有効です。

Cellには本当に必要な情報だけをViewControllerから渡す感じです。

では実際にどのように書くのか見てみましょう。


protocolの書き方

まずデータをもらいたい方(今回だとCell側)で下記のように書きます。

weak var delegate: toWebViewDelegate


 @IBAction func tap(_ sender: Any) {
       self.delegate.toWebView()
   }


protocol toWebViewDelegate: AnyObject {
    func toWebView()
}

次にデータを渡したいところ(今回だとViewController)で下記のように書きます。

今回はCellで使用しているのでdelegateの部分はcellForRowAtで処理します。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       // ここでCellを生成してから以下の処理
       cell.delegate = self
   }


// ここでtoWebViewDelegateを入力するとエラーとなり、Fixを押すことで先ほどprotocolで定義した関数が表示されます。
extension ViewController: toWebViewDelegate {
    func toWebView() {
        // こんな感じで関数内でButtonタップ時の処理を書きます
        openWeb(url: URL.iPhone(series: ten))
    }
}


このようにすることでうまくViewControllerの情報をCellに渡すことが出来ました。


ここでなんとなく気づくと思います。

DelegateってCellで欲しい情報をViewControllerからもらってきてる?っと!


その通りです!

Delegateが移譲と言われているのが、

なんとなくわかっていただけたかと思います。


この本来はCellでしたい処理を、

ViewController側にやってもらうことがDelegateの仕組みです。


今回はちょっと難しかったと思います。

Delegateは理解するまでに時間がかかると思うので、

繰り返しDelegate処理を書いてみてなんとなくこんな感じかな?と

自分なりに落とし込んでみましょう!


さいごに

プログラミングって難しいですよね。。

僕も文系大学を出て、全くの未経験からスタートしたので

気持ちは痛いほどよくわかります。。!

少しずつ勉強していけば知識が蓄積され、

いつかはそれが線として繋がる日が絶対きます!!

一緒にがんばっていきましょう!


この記事で少しでも初心者の方が、

「お!そういうことか!」とか「ちょっとわかったぞ!!」

っとなっていただけたら幸いです。



最後まで見ていただきありがとうございました!


ではまた次の記事でお会いしましょう!



この記事が気に入ったらサポートをしてみませんか?