慌不择路地浅谈一下iOS的协议protocol

来源:互联网 发布:ubuntu.vmx损坏 编辑:程序博客网 时间:2024/06/06 01:19

协议,就是一个方法列表,它声明了可以被任意类实现的方法。换句话来说,就是所有的对象,只要遵循了该协议,则拥有了这个方法列表的方法的声明。

注:在iOS当中,协议经常与代理委托结合使用,但是,这两者之间不要混为一谈。

今天写一篇关于协议的运用场景,给大家提供一种编写组件的思路,我们写一个协议:

/** 定义一套协议列表 */@protocol LBEmptyDataProtocol- (void)lb_setEmptyNoData:(NSAttributedString *)title;- (void)lb_setEmptyNoData:(NSAttributedString *)title                    block:(LBEmptyDataBlock)block;- (void)lb_setCustomView:(__kindof UIView *)customView;- (void)lb_removeEmptyData;@end@interface LBEmptyNoData : UIView@end

我们可以运用这个协议,很方便的对我们的组件进行拓展:

/** 让这个分类去实现这个协议,从而获得了接口 */@interface UIScrollView (LBEmptyData)<LBEmptyDataProtocol>@end
/** 协议的实现交由相应的类去定制实现 */- (void)lb_setEmptyNoData:(NSAttributedString *)title {    [self show:LBEmptyDataTypeNoData block:nil title:title image:nil];}- (void)lb_setEmptyNoData:(NSAttributedString *)title block:(LBEmptyDataBlock)block {    [self show:LBEmptyDataTypeNoData block:block title:title image:nil];}- (void)show:(LBEmptyDataSystemType)type block:(LBEmptyDataBlock)block title:(NSAttributedString *)title image:(UIImage *)image {    if (self.emptyDataView) {        [self.emptyDataView removeFromSuperview];        self.emptyDataView = nil;    }    ...}

这里写图片描述

这样写代码的目的,是可以对组件进行拓展,而不会污染原来的代码。

这里写图片描述

组件写完自然是要做成Spec私有库的,方便自己或者别人进行维护;而关于协议的其他东西, 这里就不啰嗦了,网上有太多的讲解了。

@end

原创粉丝点击