前段时间因为经常遇到数值的计算,本来用➕➖✖️➗。但是遇到精度问题,所以必须得用NSDecimalNumber类,而使用NSDecimalNumber类计算很不方便,需要大量的初始化和超长的方法。如下:
NSDecimalNumber *A = [NSDecimalNumber decimalNumberWithString:@"11.99"];
NSDecimalNumber *B = [NSDecimalNumber decimalNumberWithString:@"22.99"];
NSDecimalNumber *C = [A decimalNumberByAdding:B];
这样大家明白了,其实我们开发只需要知道是加减还是乘除,不需要在使用的时候有这么多的初始化操作。于是,我便想着封装起来。这时第一个反应就是链式编程了,可读性强、简洁。而链式编程的核心就是点语法加上返回对象本身。
既然知道主体思想,那么开始实现了,
比如完成 (1+2) x 3
那么大概思路应该是有个Calculation类,Calculation 有四个属性“加减乘除”,
既然要计算,每个属性肯定有个入参,而属性想调用属性,那么返回的必须是对象本身。综上,那么这个属性得是一个有入参和返回值得block。
按照思路,如下:
add(1).add(2).multiplyingBy(3)
但是为了增加代码的可读性和多次计算应该有个开始和结束,于是修正版本:
start(1).add(2).multiplyingBy(3).result
下面就该写属性了
//.h
typedef MCCalculation*(^CalculateOption)(id);
@property(nonatomic,copy) CalculateOption start;
…
….
//.m
-(CalculateOption)start{
return ^(id inputNum){
if (inputNum ==nil ||
…………….
}
return self;
};
}
最后,这样就实现一个链式编程的计算工具类,其实链式编程应用地方有很多,比如Masory自动布局库等。