加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 定义一个协议,只有在实现另一个方法时才需要一个

发布时间:2020-12-16 07:34:52 所属栏目:百科 来源:网络整理
导读:我有一个相当复杂的协议,我正在添加方法.大多数新方法都是@optional,但它们是配对的. 例如,这两种方法一起工作: @optional - (BOOL) shouldIDoSomethingHere; - (CGPoint) whereShouldIDoIt; 在这个例子中,如果实现了第一个方法,我想将第二个方法声明为@req
我有一个相当复杂的协议,我正在添加方法.大多数新方法都是@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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读