作为一个iOS 开发者,那么你一定用过Masnory/ SnapKit;
make.centerY.equalTo(self.view).offset(100);
就是这个“.”让Masonry更加鲜活的展示给了开发者,在我心中
Masnory/ SnapKit函数式编程的一个经典的代表作,非常值得参考和学习!
链式编程的好处不用再说了,用过Masnory/ SnapKit的都知道;
一步步来实现一个函数式编程:
//person方法声明:
- (void)run;
- (void)study;
//方法实现
- (void)run{
NSLog(@"run");
}
- (void)study {
NSLog(@"study")
}
//实例化并调用相关的方法
Person*person = [[Personalloc]init];
[personrun];
[personstudy];
以上三步实现了一个非常简单的程序;
最终目标:
person.runBlock().studyBlock().runBlock();
person.studyBlock().studyBlock().runBlock();
分解目标
1.先实现这种方式调用
[[person run1] study1];
2.再实现最终目标
显然,如果想要实现[person run1]调用一个方法,那么run1就需要一个返回一个对象,让这个对象去调用study1。
这样分析后,就简单了,就是增加一个返回值。
方法的声明:
-(Person*)run1;
-(Person*)study1;
方法的实现:
- (Person*)run1 {
NSLog(@"run");
return [[Person alloc] init];
}
- (Person*)study1{
NSLog(@"study");
return[[Person alloc]init];
}
实现最终目标:
person.runBlock().studyBlock().runBlock();
在OC中,`()`block是以()
的形式去执行的,猜想如果返回一个block的话,那么我就可以用()
来实现runBlock()这种效果了吧!
再结合我们的分解步骤,runBlock()代表执行了一个block,如果这个block的返回值的是一个对象的话,那么调用另外一个方法;这样就可以一直链接下去吧!实现了我们想要的目标!
声明:
- (Person* (^)())runBlock;
- (Person* (^)())studyBlock;
实现:
- (Person* (^)())runBlock {
Person* (^block)() = ^() {
NSLog(@"run");
return self;
};
return block;
}
- (Person* (^)())studyBlock {
Person* (^block)() = ^() {
NSLog(@"study");
return self;
};
return block;
}
再来看一下Masonry的一个函数式编程
make.right.equalTo(self.right).insets(kPadding);
最终调用的函数:
返回的就是一个返回值为MASConstraint的block
- (MASConstraint* (^)(id))equalTo {
return ^id(idattribute) {
return self.equalToWithRelation(attribute,NSLayoutRelationEqual);
};
}