4

我有一个相当复杂的协议,我正在向其中添加方法。大多数新方法是@optional,但它们是成对的。

例如,这两种方法一起工作:

@optional
   - (BOOL) shouldIDoSomethingHere;
   - (CGPoint) whereShouldIDoIt;

在这个例子中,如果实现了第一种方法,我想将第二种方法声明为@required,否则两者都是可选的。我想要的是一种将协议方法嵌套或分组为全部必需或不基于上下文的方法。

理想情况下是这样的:

@optional
    @required
    - (BOOL) shouldIDoSomethingHere;
    - (CGPoint) whereShouldIDoIt; 
    @endRequired 
    //... next optional method
4

1 回答 1

2

无法在编译时强制执行此操作。你最好的选择是,在运行时,当你的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;
}
于 2013-01-28T21:41:30.027 回答