#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:."];
}