一个链式加法计算器实现思路ide
1.使用时的效果ui
Calculate * manger=[Calculate new];atom
int result=manger.add(123).add(123).sub(123).result;spa
输出结果为:result:123设计
2.实现方法code
新建Calculate类;对象
添加一个属性@property(nonatomic,assign) int result,做为计算结果;blog
由于使用的方式为 result=manger.add(123).add(123).sub(123).....get
(在OC中点语法本质上是调用对象的属性的get,set方法)input
能用点语法调用说明add(123)是manger这个对象的属性,带有参数123必定是block去做为属性了,
由于能连续的使用点语法因此add(123)的返回值应该是对象自己,
由于返回对象自己后能够继续使用点语法调用这个属性;
这个block的参数的值类型应该是float/double/int等,用于传"add(123)"中的123值。
好了肯定了block的返回值类型和参数类型,能够开始设计这个block了,
以输入参数值类型为int为例 应该是
Calculter*(^)(int)=^(int inputNum){
self.result+=inputNum;
return self; };
把Calculter*(^)(int)这种形式block的做为属性的类型;在相应的get方法里实现block的操做就能够了;
下面是完整代码:
1 // Calculter.h 2 // Created by longkin on 16/1/12. 3 4 @class Calculter; 5 #import <Foundation/Foundation.h> 6 //block的名字是CalculateOption 返回值类型是Calculter* 参数类型是int 7 typedef Calculter*(^CalculateOption)(int); 8 9 @interface Calculter : NSObject 10 @property(nonatomic,assign) int result; 11 @property(nonatomic,copy) CalculateOption add; 12 @property(nonatomic,copy) CalculateOption sub; 13 @property(nonatomic,copy) CalculateOption muilt; 14 @property(nonatomic,copy) CalculateOption divide; 15 @end
1 // Calculter.m 2 // Created by longkin on 16/1/12. 3 4 #import "Calculter.h" 5 @implementation Calculter 6 7 /** 8 *add的get方法的返回值类型是block,block的返回值是对象自己 9 */ 10 -(CalculateOption)add 11 { 12 return ^(int inputNum){ 13 self.result+=inputNum; 14 return self; 15 }; 16 } 17 18 -(CalculateOption)sub 19 { 20 return ^(int inputNum){ 21 self.result-=inputNum; 22 return self; 23 }; 24 } 25 26 -(CalculateOption)muilt 27 { 28 return ^(int inputNum){ 29 self.result*=inputNum; 30 return self; 31 }; 32 } 33 34 -(CalculateOption)divide 35 { 36 return ^(int inputNum){ 37 self.result/=inputNum; 38 return self; 39 }; 40 } 41 42 @end
使用效果:
Calculter* calc =[Calculter new]; int result =calc.add(1).add(2).muilt(3).divide(3).result;