web-dev-qa-db-ja.com

メソッドを直接呼び出すのではなく、なぜプロトコルを使用するのですか?

私はインタビューでこの質問をされました。たとえば、UITableviewDelegateプロトコルにはCellForRowAtIndexpathがあります。 protocolクラスのメソッドではなく、UITableViewのデリゲートメソッドにして、直接呼び出すのはなぜですか?

4
user96307

プロトコルは、それらを実装するオブジェクトのタイプに関係なく、対話する一連のメソッドを定義するために使用されます。これにより、ビューが相互作用する外部リソースを簡単に交換し、コードの全体的な結合を減らすことができます。これは、そのタイプの知識を持つリソースを直接呼び出すのとは対照的です。

5
mortalapeman

-[tableView:cellForRowAtIndexPath:]をUITableViewControllerクラスに配置しないことで、データソースとして使用する別のクラスを作成できます(cellForRowはデータソースにあります)。これは、コードの編成やコードの再利用に役立ちます。

プロトコルに入れることで、クラスは任意のスーパークラスを持つことができます。独自のデータソースまたはデリゲートをサブクラス化するときに役立ちます。また、アプリデリゲートまたはビューサブクラス(これを行わないでください)を含め、必要な場所にデータソースを追加することもできます。

1
Jarvix

Appleはそれについて言わなければなりません

委任

委任は、Hostオブジェクトが別のオブジェクト(そのデリゲート)への弱い参照(単純なポインター参照であり、保持されないという意味で弱い)を埋め込み、タスクへの入力が必要なときに定期的にデリゲートにメッセージを送信するメカニズムです。 Hostオブジェクトは通常、何かを達成しようとしている「既成の」フレームワークオブジェクト(NSWindowやNSXMLParserオブジェクトなど)ですが、一般的な方法でしか実行できません。 ほとんどの場合カスタムクラスのインスタンスであるデリゲートは、Hostオブジェクトと連携して動作し、タスクの特定のポイントでプログラム固有の動作を提供します。 したがって、この委任により、サブクラス化を必要とせずに、別のオブジェクトの動作を変更または拡張することができます。

したがって、この場合は、カスタムビルドのセルを提供する必要がありますが、そうするためにUITableViewをサブクラス化する必要はありません。プロトコルに準拠するクラスであれば、カスタムセルを提供できます。

0
Ant