我有一个相当复杂的协议,我正在添加方法.大多数新方法都是@optional,但它们是配对的.
例如,这两种方法一起工作:
@optional
- (BOOL) shouldIDoSomethingHere;
- (CGPoint) whereShouldIDoIt;
在这个例子中,如果实现了第一个方法,我想将第二个方法声明为@required,否则两者都是可选的.我想要的是一种将协议方法嵌套或分组为基于上下文的所有需要或不需要的方法.
理想情况如下:
@optional
@required
- (BOOL) shouldIDoSomethingHere;
- (CGPoint) whereShouldIDoIt;
@endRequired
//... next optional method
最佳答案 在编译时无法强制执行此操作.您最好的选择是,在运行时,当您设置了您的委托属性时(或者您用来引用实现协议的对象),只需继续使用-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;
}