Определение протокола, требующего одного метода, только если реализован другой

У меня довольно сложный протокол, к которому я добавляю методы. Большинство новых методов @optional, но они в паре.

Например, эти два метода работают вместе:

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

В этом примере, если первый метод реализован, я хочу объявить второй метод как @requiredиначе оба являются необязательными. То, что я хочу, это способ вложить или сгруппировать методы протокола как все необходимые или не основанные на контексте.

В идеале что-то вроде:

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

1 ответ

Решение

Нет способа обеспечить это во время компиляции. Ваша лучшая ставка во время выполнения, когда ваш 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;
}
Другие вопросы по тегам