delegateについてようやく理解できたので書いておく[Swift]
iPhoneアプリ開発の学習を開始してから一ヶ月、常に私を悩ませてきた問題がある。
[Delegate]である、これが本気で何言ってるかわからない。
が、先ほど電撃のように理解したので書いておく。
delegateはなぜわかりにくい。
私はdelegateの理解のためインターネットを彷徨ったが、だいたい出てくるのはこの2つのワードである。
「委譲すること」
「依頼人になるための仕組み」
このように、まるで人間の持つ仕組みかのように書かれていた。
プログラムは人間では無いので、確かに人間を例に用いて説明するのは手っ取り早いかもしれないが初学者としては理解しにくかった。
また、「代理人になる仕組み」というものを理解しようとしても、そもそもdelegateというものが何のために存在しているのかわからないため、さっぱりわからない。
なんのためにdelegateが存在するのか。
私はdelegateの存在理由、一言で言えばメソッドの独立性を高めるためだと考える。
例えば、テキストフィールドに住所を入力すると、その住所から緯度と経度を求めるプログラムがあるとする。
このプログラムはざっくり、本当に分けると
住所(文字列)を入力される→緯度経度を求める
という構造をしている。
Appleの気持ちになって考えて見て欲しい。
仮にこれを1つのメソッドでまとめるとすると、どうなるだろうか。
「文字列を入力→なにかをする」
もしくは
「何かをする→緯度経度を求める」
という組み合わせを全て実装しなくてはならない。
Aplleが用意しなくてはならないクラス、メソッドは膨大な量になってしまう。
これに対してAppleがどうすればよいかというと、メソッドの組み合わせはユーザーの自由にできるような仕組みを作れば良いのだ。
そこで必要になってくるのが、そう[delagate]である。
先ほどの
「住所(文字列)を入力される→緯度経度を求める」
にdelegateを組み込んだ考え方をしてみる。
「住所(文字列)を入力される
→入力されたことを「緯度経度が求められるメソッド」にお知らせする
→お知らせを受けた「緯度経度を求められるメソッド」が緯度経度を求める。」
これのメリットがわかるだろうか、
お知らせ先が自由になったことにより、メソッド同士の組み合わせが自由になるのである!これはすごい!
まとめると、delegateが存在する理由というのは
『メソッドの組み合わせ(プログラムの組み方)を自由にするため』
言い換えれば
『個々のメソッドを独立した存在にさせるため』
(さっきの住所の例のようにdelegateの仕組みがないとメソッドの機能が限定されすぎてしまう)
なのである!
つまりdelegateとは
なにか「特定の動作の後」に、他の「自分にはない機能を持つメソッド」に
処理を行ってもらうためのお知らせを飛ばす仕組み!
である。
ダメ押しに例を挙げておく!
TextField上でリターンキーが押された時に、printメソッドを呼び出すよ!
class ViewController: UIViewController,UITextFieldDelegate {
@IBOutlet weak var adressField: UITextField!
@IBOutlet weak var displayMap: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
adressField.delegate = self //adressFieldのイベント時の通知先を自分自身(ViewController)に設定。
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool { //テキストフィールドでリターンキーが押されたタイミングでお知らせ
print("pushed Return") //リターンキーが押されたよ!
return true
}