链式编程

链式编程

实现一个类似于 Masonry 的链式编程,加法。

第一步

我们需要一个返回值是 Int 的方法,入参应该是一个匿名函数,也就是Block 。

#import 
@class CaculatorMaker;

@interface NSObject (Caculator)

//计算
+ (int)makeCaculators:(block)someBlock;

@end

这样,我们就可以实现这样的结构。

int result = [NSObject makeCaculators:^() {
        
}];
第二步

block 的结构。
这个 block 作为函数的参数,不需要什么返回值,但是需要一个贯穿始终的类作为参数,我们定义这个类为CaculatorMaker,block 为void (^)(CaculatorMaker *maker)

#import 
@class CaculatorMaker;

@interface NSObject (Caculator)

//计算
+ (int)makeCaculators:(void (^)(CaculatorMaker *maker))caculatorMaker;

@end
第三步

这个类需要一个整形属性@property (assign, nonatomic) int result;。在上面函数的实现中,返回这个属性,且把这个类传入 block 中。

+ (int)makeCaculators:(void (^)(CaculatorMaker *))caculatorMaker
{
    CaculatorMaker *maker = [[CaculatorMaker alloc] init];
    caculatorMaker(maker);
    return maker.result;
}
第四步

这个类需要加减乘除等算法,这个算法必须返回之前我们定义的类才可以继续反复调用,所以方法为

- (CaculatorMaker *)add:(int)value
{
    _result += value;
    return self;
}

调用为:

int result = [NSObject makeCaculators:^(CaculatorMaker *maker) {
    [[[maker add:1] add:2] add:3];
}];
第五步

但是这并不是点语法,等号右侧点语法实际是取相关 get 方法,不能有参数,所以要包装一下。返回一个 block,在 block 里再返回这个类,在 block 里传入这个 int 值。

- (CaculatorMaker *(^)(int))add
{
    return ^CaculatorMaker *(int value){
        _result += value;
        return self;
    };
}

调用

int result = [NSObject makeCaculators:^(CaculatorMaker *maker) {
    maker.add(1).add(2).add(3);
}];

补充两点
CaculatorMaker 类中 result 没设定值,所以创建时默认为0,在 makeCaculators 方法中没有重新初始化,不断叠加
maker.add(1) 完整写法其实如下
CaculatorMaker *(^block) (int value) = [maker add];
block(1);

函数式编程

实现一个类似于 rac 的函数式编程,计算输入数值结果,并与某数值比较是否相等。

第一步

我们需要一个类贯穿始终,拥有属性 result 记录当前值,isEqual 判断是否相等,caculator 方法进行计算。
caculate 方法需要返回一个 caculator 类,需要一个 block 作为参数。

@property (assign, nonatomic) BOOL isEqual;
@property (assign, nonatomic) int result;

//计算
- (Caculator *)caculate:(block)caculatorBlock;

实现如下格式:

c = [c caculate:^(block)) {
}];
第二步

分析 block 的内容,需要一个 int 入参作为初始值,一个 int 出参作为运算结果。

- (Caculator *)caculate:(int(^)(int result))caculatorBlock
{
    _result = caculatorBlock(_result);
    return self;
}  

逻辑可以放到 block 里直接进行。

c = [c caculate:^int(int result) {
    result += 2;
    result *= 5;
    return result;
}];
第三步

后续逻辑类似

- (Caculator *)equal:(BOOL (^)(int))operationBlock
{
    _isEqual = operationBlock(_result);
    return self;
}

使用

Caculator *c = [[Caculator alloc] init];
c = [[c caculate:^int(int result) {
    result += 2;
    result *= 5;
    return result;
}] equal:^BOOL(int result) {
    return result == 10;
}];
第四步

获取类中属性。

BOOL result = [[[c caculate:^int(int result) {
    result += 3;
    result *= 4;
    return result;
}] equal:^BOOL(int result) {
    return result == 12;
}] isEqual];

响应式编程的概念

在网上流传一个非常经典的解释`响应式编程的概念`
在程序开发中:
a = b + c
赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化
响应式编程,目标就是,如果 b 或者 c 的数值发生变化,a 的数值会同时发生变化;

你可能感兴趣的:(链式编程)