回答:
「公式プロトコル」のアップルページから:
オプションのプロトコルメソッドは、@ optionalキーワードを使用してオプションとしてマークできます。@optionalモーダルキーワードに対応して、デフォルトの動作のセマンティクスを正式に示す@requiredキーワードがあります。@optionalと@requiredを使用して、必要に応じてプロトコルをセクションに分割できます。キーワードを指定しない場合、デフォルトは@requiredです。
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
プロトコルのメソッドがオプションとしてマークされている場合は、オブジェクトを呼び出す前に、そのメソッドがオブジェクトに実装されているかどうかを確認する必要があります。
例として、円グラフビューは次のようにセグメントタイトルメソッドをテストします。
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
respondsToSelector:メソッドはセレクターを使用します。セレクターは、コンパイル後のメソッドの識別子を参照します。@selector()ディレクティブを使用し、メソッドの名前を指定することで、正しい識別子を提供できます。
この例のデータソースがメソッドを実装している場合、タイトルが使用されます。それ以外の場合、タイトルはゼロのままです。
@protocol MyProtocol <NSObject>
プロトコルは一連のルールです。以下の例のようにプロトコルを作成できます。
TestProtocols.h
@protocol TestProtocols <NSObject>
@optional
-(void)testMethodOptional;
@required // by default
-(void)testMethodRequired;
@end
実装:
TestClass.h
#import "TestProtocols.h"
@interface TestClass : NSObject <TestProtocols>
@end
TestClass.m
#import "TestClass.h"
@implemenation TestClass
//optional to implement
-(void)testMethodOptional{
// Your Code
}
//required to implement
-(void)testMethodRequired{
// Your Code
}
@end
プロトコルは抽象クラスと同じように機能するため、@ optionalキーワードは、実装のためにオプションであるメソッドを定義します。
したがって、コードでは、someMethod1、someMethod2、someMethod4が必須メソッドです(実装する必要があります)。someMethod3はオプションです。このメソッドを実装しなかった場合、コンパイラは警告をスローしません。
@protocol myPrtocol<NSObject>
-(void)someMethod1:(id)someArgument;
-(void)someMethod2:(id)someArugument;
@optional
-(void)someMethod3:(id)someArgument;
@required //by default
-(void)someMethod4:(id)someArgument;
@end
// sampleClass.m
@interface sampleClass : someSuperClass <myProtocol>
//...
@end