Установите любой из методов делегирования @required

#iphone #objective-c

#iPhone #objective-c

Вопрос:

У меня есть протокол, в котором у меня есть два следующих метода.

 @protocol ActionPerformerDelegate <NSObject>

@required

    - (void)actionCompleted;
    - (void)actionCompletedWithMessage:(NSString *)message;

@end
  

Если класс подтверждает соответствие этому протоколу, этот класс должен реализовать хотя бы один из этих методов. Я знаю о @обязательных и @необязательных ключевых словах. Если я использую @required, Xcode предупреждает меня о необходимости реализовать оба метода. Если я использую @optional, Xcode не предупреждает меня о необходимости реализации какого-либо из методов. Как указать, что необходимо реализовать только один из методов?

Ответ №1:

Методы протокола либо обязательны, либо необязательны; то, что вы запрашиваете, не может быть проверено во время компиляции. Однако вы могли бы пометить оба метода как необязательные и проверить, какой ваш делегат реализует во время выполнения. Что-то похожее на следующее:

 // In ActionPerformer.m.
SEL selector = @selector(actionCompletedWithMessage:);
if ([self.delegate respondsToSelector:selector]) {
  // ...
} else if ([[self.delegate class] respondsToSelector:selector]) {
  // ...
} else {
  [NSException raise:NSInvalidArgumentException format:@"delegate doesn't "
       "implement actionCompletedWithMessage:."];
}