链式编程是什么?
不讲百度得到的概念,就说自己的感受吧。OC比较让人郁闷的就是方法的调用上,如:person对象想调用它的一个对象方法doSomething,得用[person doSomething]; 而不是像Swift一样,直接使用点语法,这样在开发中会比较直观地看到。(个人观点)
直到遇到Masonry,我才对链式编程有了一定了解。
[targetView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self.view).offset(-20);
make.leading.equalTo(self.view).offset(20);
make.size.mas_equalTo(CGSizeMake(100, 100));
}];
基本上链式编程的实现简单直接讲就是使用block作为属性,来代替对象方法,而且在block中,将对象作为返回值,所以下一个block能够直接用点语法调用。
下面我用一个简单的demo实现一下链式编程,有什么不妥的地方希望大家指正。
//首先创建一个SayHello的类,里面有的成员变量有3个block,以及一个计数器;
@interface SayHello : NSObject
@property (copy,nonatomic) SayHello * (^sayhello)(NSString * human);
@property (copy,nonatomic) SayHello * (^eatSomething)(NSString * food);
@property (copy,nonatomic) SayHello * (^watchTV)(NSString * movie);
@property (assign,nonatomic) NSInteger count;
@end
接下来实例化成员变量
@implementation SayHello
- (instancetype)init{
self = [super init];
if (!self) {
return nil;
}
self.count = 0;
return self;
}
/***** 可以看到,每次实例化block之后,都会把当前对象返回,作为下一个block调用的对象 ******/
- (SayHello * (^)(NSString * human))sayhello{
return ^id(NSString * human){
self.count ++;//每一次调用block计数器+1
NSLog(@"%@-sayhello",human);
return self;
};
}
- (SayHello * (^)(NSString * food))eatSomething{
return ^id(NSString * food){
self.count ++;//每一次调用block计数器+1
NSLog(@"eating-%@",food);
return self;
};
}
- (SayHello * (^)(NSString * watchTV))watchTV{
return ^id(NSString * watchTV){
self.count ++;//每一次调用block计数器+1
NSLog(@"watching-%@",watchTV);
return self;
};
}
@end
创建一个SayHello对象,来验证链式编程效果能否实现。
- (void)viewDidLoad {
[super viewDidLoad];
SayHello * sayH = [[SayHello alloc]init];
sayH.sayhello(@"huang").eatSomething(@"apple").watchTV(@"News");
NSLog(@"总共调用了 %ld 次block",sayH.count);
}
运行程序打印出来的结果如下:
链式编程运行结果.png
实现了链式编程效果。