题记:iOS的开发语言之一--Objective-C,是一门动态语言,它使用了一种动态的消息发送机制,即对象(object)或类(class)调用方法。而OC中的点语法则只能通过setter和getter方法作用于类的属性,而不能作用于某个方法。链式编程思想则很好的解决了这个问题。
链式编程思想:核心思想为将block作为方法的返回值,且返回值的类型为调用者本身,并将该方法以setter的形式返回,这样就可以实现了连续调用,即为链式编程。
使用链式编程思想比较出色的一个第三方为Masonry,整个约束都围绕着MASConstraintMaker这个对象进行,例如:
UIView *aView = [[UIView alloc] init];
aView.backgroundColor = [UIColor redColor];
[self.view addSubview:aView];
[aView mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo(300);
make.center.equalTo(self.view);
}];
上例简单的使用了Masonry对aView添加了约束,其中mas_equalTo和equalTo方法就是将block作为getter方法的返回值,且返回的值为该对象的调用者,这样就可以一直使用点语法了。
简单使用链式编程思想实现一个简单计算器的功能:
1、新建一个名为CaculateMaker的类,用于运算:
2、在.h文件中声明一个方法add:
3.在.m文件中实现这个方法:
4.在viewController里面导入CaculateMaker.h文件,然后调用add方法就完成了链式语法:
CaculateMaker *maker = [[CaculateMaker alloc] init];
maker.add(20).add(30);
通过上面Masonry对aView进行布局可以看出,他为UIView写了一个类目,拓展了mas_makeConstraints方法,并将MASConstraintMaker对象作为block的参数传递,在block的实现里完成aView的布局,提现了函数式编程思想。同样,我们也可以给NSObject添加一个category,完成加法操作:
最后在viewController里面调用,就很轻松的实现了链式语法:
CGFloat result = [NSObject caculate:^(CaculateMaker *maker) {
maker.add(10).add(20).add(30);
}];
NSLog(@"结果为:%.2f",result);