iOS链式编程
2019-08-06 本文已影响0人
炒河粉儿
前言
通过对Masonry的学习,我们了解了链式编程的思想。此片文章是使用链式编程的思想做一个计算机,练习一下链式编程。
思考
链式编程的核心思想就是把想要做的事封装到block里面,给外界提供一个返回这个block的方法。
书写方式为返回值是一个block,block的参数放需要操作的对象或者其他内容,block的返回值是当前对象(方法调用者)
代码实现
//新建一个CaculatorMaker类作为计算机类。
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface CaculatorMaker : NSObject
@property (nonatomic, assign) int result;
- (CaculatorMaker *(^)(int))add;
- (CaculatorMaker *(^)(int))sub;
- (CaculatorMaker *(^)(int))mul;
- (CaculatorMaker *(^)(int))divide;
@end
NS_ASSUME_NONNULL_END
#import "CaculatorMaker.h"
@implementation CaculatorMaker
- (CaculatorMaker *(^)(int))add
{
__weak typeof(self) weakSelf = self;
return ^(int num) {
weakSelf.result += num;
return self;
};
}
- (CaculatorMaker *(^)(int))sub
{
__weak typeof(self) weakSelf = self;
return ^(int num) {
weakSelf.result -= num;
return self;
};
}
- (CaculatorMaker *(^)(int))mul
{
__weak typeof(self) weakSelf = self;
return ^(int num) {
weakSelf.result = num * weakSelf.result;
return self;
};
}
- (CaculatorMaker *(^)(int))divide
{
__weak typeof(self) weakSelf = self;
return ^(int num) {
weakSelf.result = weakSelf.result/num;
return self;
};
}
@end
由于每个方法的返回值都是一个block,外部调用方法传入block需要的参数调用block。block执行后,block的返回值又是当前对象本身,就可以实现继续使用点语法去继续调用方法的效果。
CaculatorMaker *maker = [[CaculatorMaker alloc]init];
maker.add(10).add(20);
NSLog(@"%d",maker.result);
Masonry的调用方法,外部提供一个block为参数的方法,将一系列的操作都写到block代码块中,使代码高聚合。因此我们也借鉴这种思想,再给这个计算机类添加一个类方法。
+ (int)caculatorTest:(void (^)(CaculatorMaker *))caculatorMakerBlock;
+ (int)caculatorTest:(void (^)(CaculatorMaker *))caculatorMakerBlock
{
CaculatorMaker *maker = [[CaculatorMaker alloc]init];
caculatorMakerBlock(maker);
return maker.result;
}
写一个类方法,这个方法的返回值为计算结果,参数为一个block,block的参数是计算机对象,方法中先创建一个计算机对象,将计算机对象作为参数传入到block中,并同时调用这个block,返回值为计算机对象的最终结果。
int result = [CaculatorMaker caculatorTest:^(CaculatorMaker *maker) {
maker.add(5).add(100).mul(2).sub(10).divide(5);
}];
NSLog(@"%d",result);
外部调用该方法的时候,block块中的代码就会被执行,计算最终结果。计算完毕后,将结果返回。