1.Masonry的语法为啥能连续的使用点语法? >> 底层使用的是:用block当函数的返回参数 > 链式编程思想
2. 使用block当函数的返回参数
// 之前开发中比较习惯,把事情封装到一个方法中,
// 链式编程思想:把要做的事情封装到block,给外界提供一个返回这个Block的方法
// 链式编程思想方法特点:方法返回值必须是block,block参数:放需要操作的内容,block返回值:方法调用者
- (void)viewDidLoad {
[super viewDidLoad];
UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
void(^block)(MASConstraintMaker *maker) = ^(MASConstraintMaker *make) {
// 描述控件的所有约束
// 上下左右间距都为10
// make.left 返回值-> MASViewConstraint
// make.left.top:把左边和顶部的约束全部保存到make.contrains
// equalTo:方法
// equalTo返回值:block
id(^block)(id attribute) = ^id(id attribute) {
// return self.equalToWithRelation(attribute, N
// SLayoutRelationEqual);
return nil;
};
block(@10);
// equalTo(@10)返回值 = self.equalToWithRelation(attribute, NSLayoutRelationE qual);
make.left.top.equalTo(@10);
make.right.bottom.equalTo(@(-10));
};
// 参数:block
[redView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(@10);
make.right.bottom.equalTo(@(-10));
}];
// mas_makeConstraints作用: 给控件设置布局, 把控件的所有约束保存到约束制造者中.
// - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block
// 1.创建一个约束制造者
// 2.调用block(maker),把所有的控件的约束全部保存到约束制造者
// 3.[constraintMaker install]:遍历约束制造者的所有约束给控件添加约束
}
计算加法为例:
1.创建一个计算者的类
- (CaculatorMaker * (^)(int num))add
{
return ^(int num){
_result += num;
return self;
};
}
2.写一个继承NSObject的类 仿Masonry的方法写一个自己的方法:+ (int)makeCaculator:(void (^)(CaculatorMaker *))block
#import "NSObject+Caculator.h"
#import "CaculatorMaker.h"
@implementation NSObject (Caculator)
+ (int)makeCaculator:(void (^)(CaculatorMaker *))block
{
// 创建计算制造者
CaculatorMaker *maker = [[CaculatorMaker alloc] init];
// 计算
block(maker);
return maker.result;
}
@end
3. 直接使用链式编程
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// add(1).add(2)
// 1.创建计算制造者
CaculatorMaker *maker = [[CaculatorMaker alloc] init];
// 10 + 20 + 30 + 40
// 链式编程思想: maker.add(10).add(20).add(30).add(40)
// int result = [maker.add(10).add(20).add(30).add(40) result];
// 提供一个没参数的add方法,返回值block
// int reslut = [[[[[maker add:10] add:20] add:30] add:40] result];
// block:使代码高聚合
int result = [NSObject makeCaculator:^(CaculatorMaker *maker) {
// 把所有的计算代码封装到这里
maker.add(10).add(20);
maker.add(30).add(40);
maker.multy(3);
}];
NSLog(@"%d",result);
}
总结:用Block实现链式编程无非就是:方法的返回值是一个Block,
Block内部装着真正要执行的方法,Block内部再返回self;
如果有参数,通过Block的参数往里传.
- ( 返回值是Block ) 方法名
{
return *{
Block内部装着真正要执行的代码
return self;
};
}