サーチ…


基本的なプロトコル定義

新しいプロトコルを定義する:

@protocol NewProtocol

- (void)protocolMethod:(id)argument;

- (id)anotherMethod;

@end

オプションおよび必須メソッド

デフォルトでは、プロトコルで宣言されたすべてのメソッドが必要です。つまり、このプロトコルに準拠するクラスであれば、それらのメソッドを実装する必要があります。

オプションのメソッドを宣言することもできます。これらのメソッドは、必要な場合にのみ実装できます。

@optionalディレクティブで任意のメソッドをマークします。

@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
@end

この場合、 anotherMethodだけがオプションとしてマークされます。 @optionalディレクティブのないメソッドは@optionalとみなされます。

@optionalディレクティブは、プロトコル定義の終わりまで、または別のディレクティブが見つかるまで、続くメソッドに適用されます。

@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
- (void)andAnotherMethod:(id)argument;
@required
- (void)lastProtocolMethod;
@end

この最後の例は、2つのオプションのメソッドと2つの必要なメソッドを持つプロトコルを定義しています。

プロトコルに準拠

次の構文は、クラスが山括弧を使用してプロトコルを採用することを示しています。

@interface NewClass : NSObject <NewProtocol>
...
@end

つまり、NewClassのインスタンスは、そのインタフェースで宣言されたメソッドに応答するだけでなく、 NewProtocolすべての必須メソッドの実装を提供します。

クラスがカンマで区切って、複数のプロトコルに準拠することも可能です。

@interface NewClass : NSObject <NewProtocol, AnotherProtocol, MyProtocol>
...
@end

単一のプロトコルに準拠する場合と同様に、クラスは各プロトコルの必要なメソッドと、実装するために選択したオプションのメソッドをそれぞれ実装する必要があります。

フォワード宣言

メソッドなしでプロトコル名を宣言することは可能です:

@protocol Person;

あなたのコード(クラス定義など)を使用してください:

@interface World : NSObject
@property (strong, nonatomic) NSArray<id<some>> *employees;
@end

後でコードのどこかにプロトコルのメソッドを定義します:

@protocol Person
- (NSString *)gender;
- (NSString *)name;
@end

プロトコル定義を使用してそのファイルをインポートするまで、プロトコルの詳細を知る必要がない場合に便利です。したがって、クラスヘッダーファイルはクリアなままで、クラスの詳細のみが含まれています。

オプションのメソッド実装の有無の確認

if ([object respondsToSelector:@selector(someOptionalMethodInProtocol:)])
{
    [object someOptionalMethodInProtocol:argument];
}

チェック準拠プロトコル

クラスがプロトコルに準拠しているかどうかを示すブール値を返します。

[MyClass conformsToProtocol:@protocol(MyProtocol) ];



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow