質問: SwiftでDelegateとProtocolの復習をしています。 現在Udemyで学んでいるのですが、そこでは**DelegateやProtocolは他のクラスの処理を簡単に呼び出せるもの**と教わりました。その理解で自分は、UITableViewDelegateなどのdelegateメソッド(didSelectRowAtやcellForRowAt)をUITableViewDelegateクラスから借りてきて使うためにProtocolが必要だという認識でいました。 しかし、自分でググってみて深く調べてみると(参照したページです→こちら) どうやらDelegateとProtocolには委任元と委任先という概念があり、委任元でProtocolをインスタンス化し、そのProtocolのメソッドであるDelegateメソッドを委任元で実行する。実際の処理はProtocolを批准した別のクラスで決めるというような理解をしました。つまりメリットとして、**あるクラス(Aクラス)では実装したくないような処理を他のクラス(Bクラス)に任せることができ、かつそのタイミングはAクラスが決めることができる**という感じで理解をしました。(他にも変数の受け渡しなどのメリットがあることも理解しました) 上記の理解(主に太字)自作で作ったDelegate、ProtocolをUITablevieViewDelegateの機能をViewControllerを使う際に当てはめてみると,ViewControllerがBクラスになると思いました。しかしAクラスに当てはまるのがどこになるかがわかりません。 素人質問で恐縮ですが、ご回答お願いいたします
回答: > > しかしAクラスに当てはまるのがどこになるかがわかりません。 > > > 上記の例でいえば`UITableView`というクラスになります。 `UITableView`はテーブルビューを管理するクラスですが、インスタンス化された時点では表示するセルの具体的な内容や選択された時の処理は把握していません。 従って、`tableView(_:cellForRowAt:)`を移譲先で定義することで、セルとして使うインスタンスを動的に決めたり、`tableView(_:didSelectRowAt:)`を移譲先で定義することで、を使ってセルが選択された時の処理を動的に決めるという流れになります。 > > あるクラス(Aクラス)では実装したくないような処理を他のクラス(Bクラス)に任せることができ、かつそのタイミングはAクラスが決めることができる > > > Aクラスでは実装したくない、というよりも「具体的に実装できない」という表現の方が近いかもしれません。