LoginSignup
1
3

More than 3 years have passed since last update.

SwiftのDelegateの解説記事を読んでも理解できなかった。だから自分で解釈しなおした。

Last updated at Posted at 2019-06-15

TL;DR

Delegateとは、『こういう時にこうしたい』という処理のうち、『こういう時』を先にまとめてくれているものです。

はじめに

Delegateの解説記事をいくつか読んだ。
実装を元に処理を委任する、されるなどの説明がなされていたが、正直わからなかった。
さらに、初学者であるため見間違いかもしれないが、実装の方法を逆にしている記事などもあった。

考えているうちに、処理を委任する、される、という考え方が自分に合ってなかったことがわかった。

本記事は、このような様々なDelegateの解説記事を読んでも謎が残ったままの人のための記事です。

つまりDelegateをどう解釈するのか

『こういう時にこうしたい』という処理のうち、『こういう時』を先にまとめてくれているもの。

処理を委任する側、される側、そしてプロトコルという言い方はわかりにくい。
僕は最初、委任する側をView Controllerなどに書いていくのかと思っていた。逆だった。
多分、「委任する」という言い方が悪かったのだと思う。

例えばUITableviewDelegateについて考え、
『SwiftのstoryboardからUITableViewをある画面にセットし、ViewController.swiftUITableViewの参照を渡した』
状態を現状だとする。

(実際はtableViewCellが絡む話だが、一旦Tableviewに内包されていると仮定して話を進めると、)
これに対して、Delegateがない状態で『あるセルをタップした時、ある処理を行いたい』と考える。すると、

if (セルをタップ) {
  選択された列 = ~
  選択された列を元にした処理
  ...

大体こんな感じの処理を書くことになるだろう。
そしてさらに『あるセルの選択状態を解除した時、ある処理を行いたい』
などの処理をどんどん書いていくことになるだろう。

するとどうなるか。コードが混沌となる。
具体的には、どのメソッドがどの時にどう発火するのかなどがわからなくなる、などが挙げられるだろう。
そうすることによって、コードとしての一貫性をうみにくく、汚いコードとなってしまう。

だから、『こういう時こうしたい』のうち、『こういう時』のみを取り出して先に定義してくれているのが、ViewControllerなどで継承しているdelegateである。
サンプルコードなどを写経した人ならわかると思うが、自動補完では下の画像のような多くのメソッドが並ぶであろう。
これらのメソッドの引数が『こういう時』を表している。

スクリーンショット 2019-06-15 19.29.40.png

ここまで理解できればもう大体は理解できたも同然で、次に、
『さらにコードを見やすくするためにはどうするか』を考える。すると、上の画像にあるように、
『引数だけが違っていて、メソッド名が同じ』なら、どのイベントで何が発火するのかが一目でわかるようになる。

だから、viewDidLoadの中に、 tableView.delegate=selfとして、『自分が実際の処理を担当しますよー』ということ、つまりtableViewメソッドの第一引数であるtableViewには、このViewControllerクラスにあるUITableViewインスタンスが入りますよーということを表明している

おそらくこれを、『委任される側』と表現してるのであろうが、どっちかというと自分から『取ってきている』ように思えるので、理解が難しかったのだと思う。

おわりに

私は委任する、されるというよりも、抽象だとか『この時』をまとめるなどの方が概念的に理解しやすかったので、書いてみた。
おそらく、私自身Swiftの言語仕様すらまだ危うい状態なので、細かい点で間違っている部分はあると思いますが、大枠は掴んでいただければと思います。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3