iOSアプリを開発しているとAppDelegateやUITableViewDelegateなど、
Delegate
というワードを良く目にすると思います。
日本語では委譲
と呼ばれます。
Cocoa frameworkでも古くから採用されてきたパターンの一つです。
例えば、UITableViewのCell選択をトリガーに何か処理をしたいとします。
どのCellを選択されたかはUITableViewしか知ることができません。
なので、Cell選択をトリガーにした処理を実装するにはUITableViewを継承する。。。?
そこで、Delegateです。
UITableViewDelegateはProtocolで、Cellが選択されたときの関数が宣言されています。
UITableViewはUITableViewDelegateの実装クラスを保持し、必要な時にDelegateの関数を呼び出します。
- Delegateパターンを使い、APIの結果を受け取る
- ViewControllerに
deinit
を実装し、ログを出力するようにしておく - ViewControllerを閉じた時に
deinit
が呼ばれることを確認する
- 結果を受け取る Delegate の例としては、位置情報をリクエストして結果を受け取る CLLocationManager と CLLocationManagerDelegate の関係が今回のやりたいことのイメージに近いです
- func requestLocation() で位置情報をリクエストし、位置情報の更新が発生したら func locationManager(CLLocationManager, didUpdateLocations: [CLLocation]) で更新された位置情報を受け取ることができます
- これを今回の課題に置き換えると、天気予報をリクエストし、天気予報の更新が発生したら、更新された天気予報を受け取る、とすると実装をイメージがつかみやすいと思います