这个与上一篇的表达式求值都是iOS课程实验内容,老师演示了一个用NSExpression实现的版本,让咱们用表达式求值的方式实现==ios
基础的教程里并无介绍这个,网上有关的中文介绍也比较少,有一篇NSHipster的文章,不过看完仍是不怎么了解NSExpression,因此这块等稍后研究下官方文档后再补充。express
仍是用MVC的模型.app
先"画"出计算器的样子,一个比较简单的计算器,能够进行四则运算。ide
Model里面主要实现下面三个方法:idea
-(void)delNumber;//退格 -(NSString *)compute;//计算 -(void)clearSpace;//清空输入
最后,ViewController须要作的是,将用户键入的字符“拼装”成字符串,而后交给Model去处理。spa
初始化calculator的实例对象
在viewDidLoad中,视图控制器初始化的时候要确保生成calculator(Model)的实例对象:设计
self.calculator = [[Calculator alloc]init];
覆盖calculator的getter方法
保证每次都能获得一个对象,而不是一个空指针指针
(Calculator *)calculatorcode
{ if (!_calculator) { _calculator = [[Calculator alloc]init]; } return _calculator; }
处理特殊字符
乘除按钮是用的特殊字符输入的,要进行计算的话须要转换成 * / 符号。对象
给按钮添加一点角度就能够变成圆角,关键是将这段修改的代码放在哪里?
利用viewWillAppear
在视图显示的时候
利用awakeFromNib
新建一个类btnView,继承自UIButton,因此它能够覆盖awakeFromNib的方法。
每一次,按钮被唤醒的时候,都会被调用。将按钮的class改为btnView便可。
能够直接利用以前的数值表达式的Model,因此要作的就剩两件事:一个是“画”计算器的界面,另外一个就是“拼装”输入的字符串。
因为个人Model设计的时候,要在表达式的末尾输入"="才能计算输出结果,因此在用户按下"="的时候,在将输入字符串input送入Model的ExpressionCalculate方法计算以前,在其末尾添加一个"="便可,这个"="能够直接从button的titleLabel得到。
NSMutableString *computeStr = [NSMutableString stringWithString:self.calculator.input]; [computeStr appendString:[[sender titleLabel] text]];
最开始会发生连续计算失败的状况,好比,先输入10*10+20,计算获得120,若是再接着按下+10=x2即我想计算(120+10)x2计算结果是140而非260。
缘由是textfield中的字符串虽然变了,可是calculator类中的input没有变,好比上面的式子,连续计算的话,input = 10x10+20+10x2 这样一个字符串。
修改的话就在每次计算完成后,将input的值改得跟textfiled里的值同样就能够了。
这是直接copy老师代码的后果==
在delNumber方法里面,将textfield里的字符删掉一个以后,又让input也调用了delNumber方法,而我每次计算以后又将input的值改得跟textfiled同样了,因此至关于退格了两次。
修改的话input不要再调用delNumber方法就能够了。
特殊字符
减号上的'-'是经过插入特殊字符里的数学符号插入的,进行isEqualToString:的时候就不是运算用的'-'了,把它删了直接从键盘输入。
不过用NSExpression的话,不用改也没问题(这里也显示出NSExpression真心强大
原来数值表达式模型中的输入检查会将"."也误判为非法运算符,我得再改改==
原来数值表达式中只考虑输入如英文字符等非法字符状况,因为在计算器中只容许输入数字和运算符,因此不合法的状况应该是输入连续的运算符,已有的方法isOperator能够用来判断,但要注意括号和其它运算符能够连续出现。
为了够算定义的double类型,可是这样每次结果都带了好多0,小数就算了,整数结果也是这样,看着好心塞……
添加了判断是否为整数的方法,虽然很简单粗暴,but it works:将doubleValue和intValue相减,若是为0则为整数,不然就是浮点数==
但愿好心人提供更好的idea。