オプションのメソッドを使用してプロトコルを作成するにはどうすればよいですか?


133

UIActionSheetDelegateたとえば、プロトコルなど、iPhone SDKで定義されているいくつかのプロトコルでオプションとしてマークされているメソッドに気づきました。

独自のプロトコルを定義し、いくつかのメソッドをオプションとして設定するにはどうすればよいですか?

回答:


248

公式プロトコル」のアップルページから:

オプションのプロトコルメソッドは、@ optionalキーワードを使用してオプションとしてマークできます。@optionalモーダルキーワードに対応して、デフォルトの動作のセマンティクスを正式に示す@requiredキーワードがあります。@optionalと@requiredを使用して、必要に応じてプロトコルをセクションに分割できます。キーワードを指定しない場合、デフォルトは@requiredです。

@protocol MyProtocol

- (void)requiredMethod;

@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;

@required
- (void)anotherRequiredMethod;

@end

4
注意: '' '@optional' ''および '' '@required' ''ディレクティブは、それに続くすべてのメソッドに適用されます。
ウェイン

31

プロトコルのメソッドがオプションとしてマークされている場合は、オブジェクトを呼び出す前に、そのメソッドがオブジェクトに実装されているかどうかを確認する必要があります。

例として、円グラフビューは次のようにセグメントタイトルメソッドをテストします。

NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
    thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}

respondsToSelector:メソッドはセレクターを使用します。セレクターは、コンパイル後のメソッドの識別子を参照します。@selector()ディレクティブを使用し、メソッドの名前を指定することで、正しい識別子を提供できます。

この例のデータソースがメソッドを実装している場合、タイトルが使用されます。それ以外の場合、タイトルはゼロのままです。


7
respondsToSelectorを使用するようにプロトコルにNSObjectのを拡張することを確認します
Fracdroid

1
右のような@protocol MyProtocol <NSObject>
ローレンスKesteloot

これは完璧な答えです!
smoothdvd 2018

14

プロトコルは一連のルールです。以下の例のようにプロトコルを作成できます。

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

12

@optionalメソッド宣言の前にキーワードを使用して、それをオプションにします。そのような単純な!

// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
    //...
@end

6

プロトコルは抽象クラスと同じように機能するため、@ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.