で宣言されたプロトコル(@protocol syntax in Objective-C)
は、「採用する」(このプロトコルを使用することを宣言する) クラスが実装する一連のメソッドを宣言するために使用されます。これは、「特定のプロトコルを実装している限り、どのクラスを使用してもかまわない」ということをコードで指定できることを意味します。これは、Objective-C で次のように実行できます。
id<MyProtocol> instanceOfClassThatImplementsMyProtocol;
これをコードに記述すると、プロトコル MyProtocol に「準拠」する任意のクラスを変数で使用できますinstanceOfClassThatImplementsMyProtocol
。これは、この変数を使用するコードは、クラスに関係なく、この特定の変数で MyProtocol で定義されているメソッドを使用できることを認識していることを意味します。これは、継承設計パターンを回避する優れた方法であり、密結合を回避します。
デリゲートは、プロトコルの言語機能を使用したものです。委任設計パターンは、必要に応じてプロトコルを使用するようにコードを設計する方法です。Cocoa フレームワークでは、デリゲート デザイン パターンを使用して、特定のプロトコルに準拠するクラスのインスタンスを指定します。この特定のプロトコルは、特定のイベントで特定のアクションを実行するためにデリゲート クラスが実装する必要があるメソッドを指定します。デリゲートを使用するクラスは、そのデリゲートがプロトコルに準拠していることを認識しているため、実装されたメソッドを特定の時間に呼び出すことができることを認識しています。この設計パターンは、クラスを分離する優れた方法です。これにより、1 つのデリゲート インスタンスを別のデリゲート インスタンスに簡単に交換できるためです。
プロトコルとデリゲートは、Objective-C と Mac/iOS の開発だけに限定されているわけではありませんが、Objective-C 言語と Apple フレームワークは、この素晴らしい言語機能とデザイン パターンを多用しています。
編集:
この例を見つけてください。UIKit framework
Cocoa Touch にはプロトコルUITextFieldDelegate
があります。UITextField
このプロトコルは、インスタンスのデリゲートであるクラスが実装する必要がある一連のメソッドを定義します。つまり、UITextField
(delegate プロパティを使用して) にデリゲートを割り当てる場合は、このクラスが に準拠していることを確認する必要がありますUITextFieldDelegate
。実際、のデリゲート プロパティUITextField
は次のように定義されているためです。
@property(nonatomic, assign) id<UITextFieldDelegate> delegate
次に、プロトコルを実装していないクラスをそれに割り当てると、コンパイラは警告を発します。これは本当に便利です。クラスがプロトコルを実装していることを述べる必要があります。そうするということは、他のクラスに、自分のクラスと特定の方法で対話できることを知らせることです。したがって、MyTextFieldDelegateClass
のデリゲート プロパティに のインスタンスを割り当てると、 はUITextField
、 のUITextField
特定のメソッド (テキスト入力、選択などに関連) を呼び出すことができることを認識しますMyTextFieldDelegateClass
。プロトコルMyTextFieldDelegateClass
を実装すると言っているので、これを知っています。UITextFieldDelegate
最終的に、これらすべてがプロジェクトのコードの柔軟性と適応性を大幅に向上させます。このテクノロジを使用した後、すぐにそれを実現できると確信しています! :)