iOS 开发之使用链式编程思想实现简单的计算器

  链式编程思想是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。例如 a(1).b(2).c(3)。

  链式编程思想最为关键的是,方法的返回值是block,block必须返回对象本身(返回block时,block所在的方法调用者对象)block的参数是需要操作的值。;

  在iOS开发中,使用链式编程思想最好的代表是 Masonry 自动约束布局:

  例如:

[itemButton mas_makeConstraints:^(MASConstraintMaker *make) {
                make.left.equalTo(contentView.mas_left).offset(15 + (itemWidth+15)*i);
                make.top.equalTo(contentView.mas_top).offset(255);
                make.width.height.equalTo(@(itemWidth));
            }];

  执行流程为:

/**
        mas_makeConstraints执行流程:
        1.创建约束制造者MASConstraintMaker,并且绑定控件,生成一个保存所有约束的数组
        2.执行mas_makeConstraints传入的Block
        3.让约束制造者安装约束!
            * 1.清空之前的所有约束
            * 2.遍历约束数组,一个一个安装
   */

  可以看出,使用链式编程,代码可读性较好。

  仿照 Masnory 使用链式编程思想写个运算器:

#import <Foundation/Foundation.h>

@interface CalculateManager : NSObject

@property (nonatomic, assign) int result;


- (CalculateManager *(^)(int value))add;

- (CalculateManager *(^)(int value))minus;

- (CalculateManager *(^)(int value))multiply;

- (CalculateManager *(^)(int value))devite;


@end

  

#import "CalculateManager.h"

@implementation CalculateManager

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

- (CalculateManager *(^)(int))minus {
    return ^(int value) {
        _result -= value;
        return self;
    };
}

- (CalculateManager *(^)(int))multiply {
    return ^(int value) {
        _result *= value;
        return self;
    };
}

- (CalculateManager *(^)(int))devite {
    return ^(int value) {
        _result /= value;
        return self;
    };
}

@end

  

#import "NSObject+Calculate.h"

#import "CalculateManager.h"

@implementation NSObject (Calculate)

+ (int)ztb_calculateValue:(void(^)(CalculateManager *make))block
{
    CalculateManager *manager = [[CalculateManager alloc] init];
    block(manager);
    return manager.result;
}

@end

  在使用时:

int result = [NSString ztb_calculateValue:^(CalculateManager *make) {
        make.add(19).multiply(10).devite(5).minus(5).add(8);
    }];

  可以在 Block 中进行运算了

原文地址:https://www.cnblogs.com/ZachRobin/p/9794192.html