首先我们看一下使用Masonry对控件进行布局的代码格式。
[self.bottomView1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(20);
make.width.mas_equalTo(30);
make.bottom.mas_equalTo(-20);
make.height.mas_equalTo(40);
}];
上边这段代码有特点
- 使用点语法
- 可以进行链式调用
那么实现链式编程就需要解决上边两个问题。
一、点语法
1、使用无参无返回值block
/*
* Function.h
*/
#import <Foundation/Foundation.h>
@class Function1;
typedef void(^mBlock)();
@interface Function1 : NSObject
- (mBlock)function;
@end
/*
* Function.m
*/
#import "Function1.h"
@implementation Function1
- (mBlock)function{
return ^{
NSLog(@"无参无返回值block!");
};
}
@end
/*
* 调用
*/
- (void)viewDidLoad {
[super viewDidLoad];
Function1 *fun1 = [Function1 new];
fun1.function();
}
使用这种方式就可以做到点语法调用方法。但是我们可以发现这种写法无法传入参数。接下来我们继续解决这个问题。
2、使用有参无返回值block
/*
* Function2.h
*/
#import <Foundation/Foundation.h>
@class Function2;
typedef void(^mBlock1)(NSString *str);
@interface Function2 : NSObject
- (mBlock1)function;
@end
/*
* Function.m
*/
#import "Function2.h"
@implementation Function2
- (mBlock1)function{
return ^(NSString *str){
NSLog(@"我想:%@", str);
};
}
@end
/*
* 调用
*/
- (void)viewDidLoad {
[super viewDidLoad];
Function2 *fun2 = [Function2 new];
fun2.function(@"吃饭");
}
通过给block加入参数,这样在使用点语法调用方法时返回一个block,通过给block加入参数即可达到目的。接下来就剩下最后一个问题:如何实现链式调用。
使用有参有返回值的block
/*
* Function.h
*/
#import <Foundation/Foundation.h>
@class Function3;
typedef Function3 *(^mBlock2)(NSString *str);
@interface Function3 : NSObject
- (mBlock2)function;
@end
/*
* Function.m
*/
#import "Function3.h"
@implementation Function3
- (mBlock2)function{
return ^Function3 *(NSString *str){
NSLog(@"我想:%@", str);
return self;
};
}
@end
/*
* 调用
*/
- (void)viewDidLoad {
[super viewDidLoad];
Function3 *fun3 = [Function3 new];
fun3.function(@"吃饭").function(@"喝水").function(@"睡觉");
}