TL;DR
Delegate
とは、『こういう時にこうしたい』という処理のうち、『こういう時』を先にまとめてくれているものです。
はじめに
Delegate
の解説記事をいくつか読んだ。
実装を元に処理を委任する、されるなどの説明がなされていたが、正直わからなかった。
さらに、初学者であるため見間違いかもしれないが、実装の方法を逆にしている記事などもあった。
考えているうちに、処理を委任する、される、という考え方が自分に合ってなかったことがわかった。
本記事は、このような様々なDelegateの解説記事を読んでも謎が残ったままの人のための記事です。
つまりDelegateをどう解釈するのか
『こういう時にこうしたい』という処理のうち、『こういう時』を先にまとめてくれているもの。
処理を委任する側、される側、そしてプロトコルという言い方はわかりにくい。
僕は最初、委任する側をView Controller
などに書いていくのかと思っていた。逆だった。
多分、「委任する」という言い方が悪かったのだと思う。
例えばUITableviewDelegate
について考え、
『SwiftのstoryboardからUITableView
をある画面にセットし、ViewController.swift
にUITableView
の参照を渡した』
状態を現状だとする。
(実際はtableViewCellが絡む話だが、一旦Tableviewに内包されていると仮定して話を進めると、)
これに対して、Delegateがない状態で『あるセルをタップした時、ある処理を行いたい』と考える。すると、
if (セルをタップ) {
選択された列 = ~
選択された列を元にした処理
...
大体こんな感じの処理を書くことになるだろう。
そしてさらに『あるセルの選択状態を解除した時、ある処理を行いたい』
などの処理をどんどん書いていくことになるだろう。
するとどうなるか。コードが混沌となる。
具体的には、どのメソッドがどの時にどう発火するのかなどがわからなくなる、などが挙げられるだろう。
そうすることによって、コードとしての一貫性をうみにくく、汚いコードとなってしまう。
だから、『こういう時こうしたい』のうち、『こういう時』のみを取り出して先に定義してくれているのが、ViewControllerなどで継承しているdelegate
である。
サンプルコードなどを写経した人ならわかると思うが、自動補完では下の画像のような多くのメソッドが並ぶであろう。
これらのメソッドの引数が『こういう時』を表している。
ここまで理解できればもう大体は理解できたも同然で、次に、
『さらにコードを見やすくするためにはどうするか』を考える。すると、上の画像にあるように、
『引数だけが違っていて、メソッド名が同じ』なら、どのイベントで何が発火するのかが一目でわかるようになる。
だから、viewDidLoad
の中に、 tableView.delegate=self
として、『自分が実際の処理を担当しますよー』ということ、つまりtableViewメソッドの第一引数であるtableView
には、このViewController
クラスにあるUITableView
インスタンスが入りますよーということを表明している。
おそらくこれを、『委任される側』と表現してるのであろうが、どっちかというと自分から『取ってきている』ように思えるので、理解が難しかったのだと思う。
おわりに
私は委任する、されるというよりも、抽象だとか『この時』をまとめるなどの方が概念的に理解しやすかったので、書いてみた。
おそらく、私自身Swiftの言語仕様すらまだ危うい状態なので、細かい点で間違っている部分はあると思いますが、大枠は掴んでいただければと思います。