masonry git:https://github.com/SnapKit/Masonry
Masonry 中的链 是如何实现的 ?
[myView mas_makeConstraiots:^(MASContraintMaker *make){
make.top.left.equalTo(@20);
make.bottom.right.equalTo(@-20);
}];
//链式编程 可以提供简洁清晰,业务代码更集中的接口,让其他人使用起来更加方便,更加舒服,没有拖沓的感觉
首先,4行代码有很多知识点,一个一个分析
第一点,如何通过.(点)调用方法?
iOS中使用点都是调用属性的getter方法来获取属性值,如何调用普通的方法呢?
先了解一下getter方法是什么?
1.必须是对象方法;
2.必须有返回值,返回值的类型和成员变量的类型一致;
3.方法名必须是成员变量去掉下划线; (无视它)
4.一定是没有参数的.
简单来说,就是有返回值,没有参数的方法,在iOS中就可以被点语法所调用
举个栗子:
@implementation Person
-(NSString *)getFirstName{
return "Charlie";
}
-(NSString *)getLastName{
return "Chaplin";
}
@end
第二点,如何通过.(点) 连续调用方法?
了解完第一点后在了解这点 就会轻松很多,使用点调用方法,怎么实现连续调用呢?
使用make.top.left. 举个栗子:
top 是谁在调用?left 又是谁在调用?
答案就是make在调用top,然后再调用left,咋回事呢?
拆解一下:make.top, make.left 。当 make.top 的返回值为make 的时候,就可以继续使用点调用left
使用Person继续举栗:
-(Person *)getFirstName{
return self;
}
-(Person *)getLastName{
return self;
}
这样 就可以使用连续的点调用方法了
Person *p = [Person alloc]init];
p.getFirstName.getLastName;
第三点,如何通过equalTo方法设置属性?
make.top.left.equalTo(@20);
.equalTo(@20); 这就是一个Block 的方法调用
equalTo() 如何写才能实现呢? 把一个block作为函数的返回值返回
-((^)(int))getAge{
return ^(int age){
self.age = age;
};
}
这样写就可以实现了Person.getAge(18);的写法
第四点,结合2,3两点实现函数链
getSex的返回值为block,再把block执行后的返回值设置为Person 就可以实现
-(Person *(^)(NSString*))getSex{
return ^(NSString* sex){
self.sex = sex;
return self;
};
}
p.getFirstName.getLastName.getSex(@"女").getAge(18);
第五点:make.top.left.equalTo(@20) 实现原理
make需要生成一个素组用于保存需要配置的约束
当调用top方法时,就将top的约束配置加入到约束数组里,然后返回self 提供链编程方法
当调用left方法时,同top的方法调用
最后调用equalTo()方法时,遍历约束数组,逐个配置约束数组里的约束
如何使用一个链式编程提供一个优雅一些的接口:
如果有一个Person类,平时的写法是这样的
Person *p = [[Person alloc]init];
p.firstName = "Charlie";
p.lastName = "Chaplin";
p.sex = "男"
p.age = 20; .......
p.job = "演员";
使用链可以把代码简洁为:
Person *p = [[Person alloc]init];
[p createPerson:^(Person *pCreater){
pCreate.firstName("Charlie").lastName("Chaplin").sex("男").age(20).job("演员");
//优点:person 的业务代码全部集中在了这个block里面,并且看起来简洁清晰
}];
总结:在iOS中实现链式编程并不难,主要的想法就是返回self,通过self 再次调用getter类型方法,做什么事情就要用到block作为返回值,再把self作为block的返回值返回。如果想深入学习链式编程,翻翻Masonry的代码吧。
网友评论