我有一个相当复杂的协议,我正在添加方法。 大多数新方法都是@optional
的,但它们是配对的。
例如,这两种方法协同工作:
@optional
- (BOOL) shouldIDoSomethingHere;
- (CGPoint) whereShouldIDoIt;
在此示例中,如果实现了第一个方法,我想将第二个方法声明为 @required
,否则两者都是可选的。 我想要的是一种基于上下文嵌套或分组协议方法的方法,无论是必需的还是非必需的。
理想情况下是这样的:
@optional
@required
- (BOOL) shouldIDoSomethingHere;
- (CGPoint) whereShouldIDoIt;
@endRequired
//... next optional method
没有
办法在编译时强制执行。最好的办法是在运行时,当设置了 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;
}