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块中的代码就会被执行,计算最终结果。计算完毕后,将结果返回。

上一篇下一篇

猜你喜欢

热点阅读