场景
实现连续加法运算 1 + 2 + 3 + 4.。。。
普通实现
-(NSInteger)addWithParam1:(NSInteger)param1 param2:(NSInteger)param2 param3:(NSInteger)param3{
return param1 +param2 + param3;
}
如果有很多如此做法非常麻烦。
我们想实现如下效果的调用,类似于masonry,也就是所谓的链式编程,看起来就十分高大上
int result = [NSObject makeAddManger:^(AddManger *mgr) {
mgr.add(3).add(4).add(5);
}];
下面就看如何实现
1、先定义一个NSObject的分类如下:
#import "AddManger.h"
@interface NSObject (RZ)
+ (int)makeAddManger:(void(^)(AddManger *))block;
@end
================================================================
#import "NSObject+RZ.h"
@implementation NSObject (RZ)
+ (int)makeAddManger:(void (^)(AddManger *))block
{
AddManger *mgr = [[AddManger alloc] init];
block(mgr);
return mgr.result;
}
@end
2、继续定义一个类实现计算过程,比如add:
#import@interface AddManger : NSObject
@property (nonatomic, assign)int result;
- (AddManger *(^)(int))add;
@end
================================================================
#import "AddManger.h"
@implementation AddManger
- (AddManger *(^)(int))add
{
AddManger *(^aBlock)(int) = ^(int value){
_result += value;
return self;
};
return aBlock;
}
当然也可以写成这样
- (AddManger *(^)(int))add
{
return ^(int value) {
_result += value;
return self;
};
}
@end
3.然后调用
int result = [NSObject makeAddManger:^(AddManger *mgr) {
mgr.add(3).add(4).add(5);
}];
NSLog(@"result====%d", result);
4.实现过程
1.步骤3,调用nsobject的分类方法makeAddManger:^(AddManger *mgr)block,该方法的参数是一个block,在这里传递一个定义好的block到该函数。block的实现是mgr.add(3).add(4).add(5)
2.步骤1,是分类方法makeAddManger:^(AddManger *mgr)block的具体实现,该方法内部初始化一个AddManger实例对象mgr,然后作为block的参数传入block,也就是步骤3的block内部的mgr参数,然后调用该block,也就是上一步实现的这句代码mgr.add(3).add(4).add(5),然后返回执行完毕后的结果,也就是mgr.result。
3是链式调用代码mgr.add(3).add(4).add(5)的关键,可以看到add方法返回的是一个block,该block的实现是累加传递进来的值然后赋值给属性result保存下来,然后返回值是self,也就是AddManger实例对象。这样可以实现点语法继续调用add方法。