4

メソッドを追加しているかなり複雑なプロトコルがあります。新しいメソッドのほとんどはですが@optional、ペアになっています。

たとえば、次の2つの方法は連携して機能します。

@optional
   - (BOOL) shouldIDoSomethingHere;
   - (CGPoint) whereShouldIDoIt;

この例では、最初のメソッドが実装されている場合、2番目のメソッドをとして宣言し@requiredます。それ以外の場合は両方ともオプションです。私が欲しいのは、すべてが必要であるか、コンテキストに基づいていないかのいずれかとして、プロトコルメソッドをネストまたはグループ化する方法です。

理想的には次のようなものです。

@optional
    @required
    - (BOOL) shouldIDoSomethingHere;
    - (CGPoint) whereShouldIDoIt; 
    @endRequired 
    //... next optional method
4

1 に答える 1

2

コンパイル時にこれを強制する方法はありません。delegate実行時に、プロパティ(またはプロトコルを実装するオブジェクトを参照するために使用するもの)が設定されたら、そこに必要な適合規則を実装し、オブジェクトが設定されてい-respondsToSelector:ない場合はすぐに例外をスローするのが最善の策です。あなたの規則に従わない。何かのようなもの:

- (void)setDeleate:(id<MyDelegate>)delegate {
    if ([delegate respondsToSelector:@selector(shouldIDoSomethingHere)]) {
        NSAssert([delegate respondsToSelector:@selector(whereShouldIDoIt)], @"Delegate must respond to -whereShouldIDoIt if it responds to -shouldIDoSomethingHere");
    }
    // ...
    _delegate = delegate;
}
于 2013-01-28T21:41:30.027 に答える