objective-c 一个链式加法计算器实现

一个链式加法计算器实现思路

1.使用时的效果

Calculate * manger=[Calculate new];

int result=manger.add(123).add(123).sub(123).result;

输出结果为:result:123

2.实现方法

新建Calculate类;

添加一个属性@property(nonatomic,assign) int result,作为计算结果;

因为使用的方式为 result=manger.add(123).add(123).sub(123).....

(在OC中点语法本质上是调用对象的属性的get,set方法)

能用点语法调用说明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;