设置任何一个委托方法是@required

时间:2011-04-30 10:57:01

标签: iphone objective-c

我有一个协议,我有两种方法如下。

@protocol ActionPerformerDelegate <NSObject>

@required

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

@end

如果某个类确认了该协议,则该类应至少实现其中一种方法。我知道 @required @optional 关键字。如果我使用@required,Xcode警告我实现这两种方法。如果我使用@optional Xcode并不警告我实现任何方法。如何指定单独实现任何一种方法是必要的?

1 个答案:

答案 0 :(得分:4)

协议方法是必需的或可选的;在编译时无法检查您要求的内容。但是,您可以将这两个方法标记为可选,并检查您的委托在运行时实现的方法。类似于以下内容:

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