iOS链式写法尝试

相信大家都自定义过View,如果参数传的过多,那么初始化的方法就会变得很长

/** init方法 */

- (instancetype)initWithTitleArray:(NSArray*)titleArray

                   titleColorArray:(NSArray*)titleColorArray

                     btnColorArray:(NSArray*)btnColorArray;

如果只是自己使用的话,那还是可以接受的。但是如果将这个类作为公用类,将来别人用到的时候,有可能需要修改初始化方法,往里面添加参数,有些参数传值的时候还有约束,需要设置成nil,这样就很不利于维护,也不美观。

当然我们也可以这样初始化信息

/** 按钮上的文字数组 */

@property (nonatomic, strong) NSArray *titleArray;

/** 按钮上的文字颜色 */

@property (nonatomic, strong) NSArray *titleColorArray;

/** 按钮背景颜色 */

@property (nonatomic, strong) NSArray *btnColorArray;

能不能像masonry一样,通过链接的方式将参数赋值上去,下面就是我们想要实现的目标。

tv.titleArray(@[@"选择", @"加入打印列表", @"打印"]) .titleColorArray(@[[UIColor lightGrayColor]).btnColorArray([UIColor blueColor]);

探索

网上查了下资料,oc的方法是以中括号[]调用的,而()只有通过block的形式,所以我们有了大体的方向。

先写一个titleArray的block,注意这里的返回值要写他本身,否则后续调用其他参数的时候就会报错,毕竟void是没有方法的。

.h文件

- (TestView *(^)(NSArray *))titleArray;

.m文件

- (TestView *(^)(NSArray *))tvTitleArray {     return ^(NSArray *titleArray) {         self.titleArray = titleArray;         return self;     }; }

这里稍微解读下block

block的一般声明方式是:返回值类型(^block名称)(参数列表),

block实现是这样的,block变量=^(参数列表){函数实现};

.h文件解读
iOS链式写法尝试_第1张图片
.m文件解读

当然我们这边可以通过typedef定义block,下面是使用过程。

typedef TestView *(^titleColorBlock)(NSArray *);

.h文件

- (titleColorBlock)tvTitleColorArray;

.m文件

- (titleColorBlock)tvTitleColorArray {     return ^(NSArray *titleColorArray) {         self.titleColorArray = titleColorArray;         return self;     } }

其他信息就不重复了,最后看下调用以及结果展示

        tv.tvBtnColorArray(@[[UIColor yellowColor], [UIColor redColor]])

        .tvTitleArray(@[@"选择", @"加入打印列表", @"打印"])

        .tvTitleColorArray(@[[UIColor lightGrayColor], [UIColor greenColor], [UIColor blueColor]])

        .tvUpdateUI();


UI展示

OK,收工。

你可能感兴趣的:(iOS链式写法尝试)