protocol
とdelegate
の違いは何ですか?
そして、
protocol class
でvariables
を宣言するにはどうすればよいですか?
(Objective-Cの_@protocol
_構文)で宣言されたプロトコルは、クラスが「採用」する(このプロトコルを使用することを宣言する)メソッドのセットを宣言するために使用されます。これは、「特定のプロトコルを実装する限り、どのクラスが使用されるかは気にしない」ことをコードで指定できることを意味します。これは、Objective-Cで次のように実行できます。
_id<MyProtocol> instanceOfClassThatImplementsMyProtocol;
_
コードでこれを指定すると、プロトコルMyProtocolに「準拠する」クラスを変数instanceOfClassThatImplementsMyProtocolで使用できます。つまり、この変数を使用するコードは、どのクラスであるかに関係なく、この特定の変数でMyProtocolで定義されているメソッドを使用できることを知っています。これは、継承の設計パターンを回避する優れた方法であり、密結合を回避します。
デリゲートは、プロトコルの言語機能の使用です。 委任設計パターン は、必要に応じてプロトコルを使用するようにコードを設計する方法です。 Cocoaフレームワークでは、デリゲートデザインパターンを使用して、特定のプロトコルに準拠するクラスのインスタンスを指定します。この特定のプロトコルは、特定のイベントで特定のアクションを実行するためにデリゲートクラスが実装するメソッドを指定します。デリゲートを使用するクラスは、そのデリゲートがプロトコルと一致することを知っているため、指定された時間に実装されたメソッドを呼び出すことができることを知っています。この設計パターンは、あるデリゲートインスタンスを別のデリゲートインスタンスと非常に簡単に交換できるため、クラスを分離するのに最適な方法です。プログラマは、置換インスタンスまたはクラスが必要なプロトコルに準拠していることを確認するだけです(つまり、プロトコルで指定されたメソッド)!
プロトコルとデリゲートは、Objective-CおよびMac/iOSの開発だけに限定されませんが、Objective-C言語とAppleフレームワークは、この素晴らしい言語機能とデザインパターンを多用します。
編集:
以下に例を示します。 Cocoa TouchのUIKitフレームワークには、UITextFieldDelegateプロトコルがあります。このプロトコルは、UITextFieldインスタンスのデリゲートであるクラスが実装する一連のメソッドを定義します。つまり、デリゲートをUITextFieldに(delegate
プロパティを使用して)割り当てたい場合、このクラスがUITextFieldDelegate。実際、UITextFieldのデリゲートプロパティは次のように定義されているためです。
@property(nonatomic, weak) id<UITextFieldDelegate> delegate
プロトコルを実装しないクラスを割り当てると、コンパイラーは警告を出します。これは本当に便利です。クラスはプロトコルを実装していると述べる必要があり、それを実行するということは、クラスが特定の方法でクラスと対話できることを他のクラスに知らせることです。したがって、MyTextFieldDelegateClassのインスタンスをUITextFieldのdelegate
プロパティに割り当てると、UITextFieldknowsMyTextFieldDelegateClassの特定のメソッド(テキスト入力、選択などに関連する)を呼び出すことができること。これは、MyTextFieldDelegateClassがUITextFieldDelegateプロトコルを実装すると言っているためです。
最終的に、これらすべてがプロジェクトのコードの柔軟性と適応性を大幅に向上させます。このテクノロジを使用すると、すぐに気付くはずです。 :)
プロトコルは、そのプロトコルに準拠するクラスによって実装される一連のメソッド(オプションまたは必須)です。一方、デリゲートは、そのプロトコルに準拠するクラスへの参照であり、プロトコルで定義されたメソッドを実装します。
詳細については this Apple doc をご覧ください。
委任:別のオブジェクトに代わって行動する(おっとでデザインパターン)
これは、設計パターンであり、デリゲートと呼ばれるオブジェクトが別のオブジェクトに代わって、要求に応じて動作します。実行中のある時点で、そのオブジェクトにメッセージを送信します委任;メッセージは、イベントが発生することをデリゲートに伝え、応答を要求します。デリゲートは、メッセージによって呼び出されたメソッドを実装し、適切な値を返します
例は、appdelegateオブジェクトがappobjectに代わって動作することです。
プロトコル:継承に関係のないオブジェクト間の通信の有効化
プロトコルは、任意のクラスが実装できるメソッドを持つプログラムインターフェイスの宣言です。プロトコルはObjective C言語機能です。簡単に言えば、任意のクラスが実装できるメソッドのリストです。プロトコルを確認する必要があります。例はUITableviewDatasourceプロトコルです。このメソッドのメソッドcellforRowAtIndexPathはプロトコルで宣言されていますが、TableViewを作成するために実装しています。
プログラムでデリゲートの宣言を見てみましょう
id<myProtocol> *delegatingObject;
DelegatingObjectは、他のオブジェクトへの参照を保持し、適切なタイミングでそのオブジェクトにメッセージを送信します。
プロトコルは、任意のクラスで実装できる関連プロパティとメソッドのグループです。
MyProtocol(関連するプロパティとメソッドのグループ)を確認するオブジェクト(idタイプ)はデリゲートとして機能できること、または必要な学位(プロトコル)を持つ人(id)が教師(デリゲート)として機能すると言うことができることを意味します。
ルールのセットとしてProtocolと言うことができます。プロトコルで使用する必要があるように、そのルールはオプションでも必須でもかまいません。
デリゲートは、Objective CおよびSwiftのメッセージパッシングテクニックです。オブジェクトはそのメッセージを処理する必要があります。
例:すべてのiOS開発者が使用した簡単な例はUITableviewです。テーブルを作成するときに、コントローラーにcellForRowAtIndexPath()
とnumberOfRowsInSection()
を実装する必要があります。プロトコル)は、必要に応じてUItableviewクラスで定義されます。これは必須ですProtocol。
heightForRowAtIndexPath()
のような他のプロトコルがありますが、これはオプションです。
Delegate UITableViewには、イベントのメッセージを送信するmethod(message)didSelectRowAtIndexPath()
があります。デリゲートをselfに設定すると、コントローラーの準備ができたことを意味します。そのイベントの世話をします。
この用語は、私たちが一緒に使用する習慣があるため、開発者にとってより混乱しやすいようです(:
楽しい!!!!