链式编程思想
程序员文章站
2022-07-12 16:29:11
...
- 写一个计算的类,用Block实现,并返回Block
#import <Foundation/Foundation.h>
@interface CaculatorMaker : NSObject
@property (nonatomic, assign) int result;
// 加减乘除 Block实现
- (CaculatorMaker *(^)(int))add;
- (CaculatorMaker *(^)(int))sub;
- (CaculatorMaker *(^)(int))muilt;
- (CaculatorMaker *(^)(int))divide;
@end```
import "CaculatorMaker.h"
@implementation CaculatorMaker
-
(CaculatorMaker *(^)(int))add
{
return ^CaculatorMaker *(int value){self.result += value; return self;
};
} -
(CaculatorMaker *(^)(int))muilt
{
return ^CaculatorMaker *(int value){self.result *= value; return self;
};
} -
(CaculatorMaker *(^)(int))sub
{
return ^CaculatorMaker *(int value){self.result -= value; return self;
};
} -
(CaculatorMaker *(^)(int))divide
{
return ^CaculatorMaker *(int value){self.result /= value; return self;
};
}
@end```
- 给NSObject(所有的类)添加一个计算方法 实现仍是创建计算对象maker,调用Block把值传递出去,用maker接收之后,可继续调用,形成无限传递,并无限使用。
#import <Foundation/Foundation.h>
@class CaculatorMaker;
@interface NSObject (Caculator)
// 计算
+ (int)makeCaculators:(void(^)(CaculatorMaker *make))caculatorMaker;
@end```
import "NSObject+Caculator.h"
import "CaculatorMaker.h"
@implementation NSObject (Caculator)
-
(int)makeCaculators:(void (^)(CaculatorMaker *))caculatorMaker
{
CaculatorMaker *maker = [[CaculatorMaker alloc] init];caculatorMaker(maker);
return maker.result;
}
@end```
#import "ViewController.h"
//define this constant if you want to use Masonry without the 'mas_' prefix
#define MAS_SHORTHAND
//define this constant if you want to enable auto-boxing for default syntax
#define MAS_SHORTHAND_GLOBALS
#import "Masonry.h"
#import "NSObject+Caculator.h"
#import "CaculatorMaker.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
// 设置布局
[redView makeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(10);
make.right.equalTo(-10);
}];
// Masonry实现原理
// 1.给所有UIView提供一个设置约束的方法makeConstraints
// 2.makeConstraints方法实现:
// 2.1 创建约束制造者,约束制造者提供了很多设置约束的方法,每个制造约束(equalTo)的方法,方法不需要参数,但是必须返回block,每个block需要传入一个参数,计算什么值。
// 2.2 把约束制造者传入block中,block用于把所有的约束保存到约束制造者中。
// 3.执行block,
// 4.利用约束制造者给view一次性添加所有约束。
// 模仿masonry,设计计算器。
// 链式编程思想,每一个操作都返回block
// 1.给所有类提供一个计算方法makeCaculator,
// 2.创建计算制造者,计算制造者提供了很多方法计算,每个计算方法,方法不需要参数,但是必须返回block,每个block需要传入一个参数,计算什么值。
// 3.传入block,block用于把所有的计算保存到计算制造者中
// 4.执行blcok
// 5.把计算制造者计算的值,返回出去。
// (1 + 2 + 3 + 4) / 5
int result = [NSObject makeCaculators:^(CaculatorMaker *make) {
make.add(1).add(2).add(3).add(4).divide(5);
}];
NSLog(@"%d",result);
}
@end```
上一篇: js操作json对象