OC 方法的调用都是通过 [] 实现的,如果想要连续调用就要进行多层嵌套,我们可以利用 block 的来实现 Objective-C 方法的链式调用。像这种用于特定领域的表达方式,我们叫做 DSL (Domain Specific Language)。
关于 block 的用法
1、函数式编程
把 block 当做函数的参数,可以把逻辑和函数放在调用时候的 block 里面,而不是方法内部。把相关的逻辑都放在一起,提高了开发效率和程序的可读性。这其实就是函数式编程思想。函数式编程在很多的第三方框架中都有明显的提现,比如 AFNetWorking、Masonry 等。
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
2、链式调用
外面的 block 就是函数式编程的一个体现,在 block 内部并不像常规的 OC 语言,而是不断的使用点语法调用,极大的精简了代码量,同时也拥有很好的可读性,使用方便,这种方式就叫做链式调用。
链式调用是怎么实现的呢?
* 后面带括号,说明方法的返回值是一个 block;
* 调用方法肯定是对象才可以调用,说明 block 的返回值是一个对象;
* 点语法说明这个方法没有参数;
结合以上三点,一个没有参数 & 有返回值 & 返回值是 block & block 的返回值是方法的调用者,就可以实现链式调用。
调用方法:
testBtn.YTitle(@"测试", UIControlStateNormal).YTitleColor([UIColor blueColor], UIControlStateNormal).YFrame(CGRectMake(100, 300, 100, 50)).YBackgroundColor([UIColor yellowColor]).YAddToView(self.view);
本文 demo:https://github.com/yuetianlu/UIBaseDSL.git,给常用的系统原生 UI 控件扩展了链式调用用法。
参考文章: