资讯专栏INFORMATION COLUMN

基于iOS的简单计算器(一)

CatalpaFlat / 1491人阅读

摘要:思路还是用的模型先画出计算器的样子,一个比较简单的计算器,可以进行四则运算。使用数值表达式实现思路可以直接利用之前的数值表达式的,所以要做的就剩两件事一个是画计算器的界面,另一个就是拼装输入的字符串。

这个与上一篇的表达式求值都是iOS课程实验内容,老师演示了一个用NSExpression实现的版本,让我们用表达式求值的方式实现==

使用NSExpression实现 NSExpression是什么

基础的教程里并没有介绍这个,网上有关的中文介绍也比较少,有一篇NSHipster的文章,不过看完还是不怎么了解NSExpression,所以这块等稍后研究下官方文档后再补充。

思路

还是用MVC的模型.

先"画"出计算器的样子,一个比较简单的计算器,可以进行四则运算。

Model里面主要实现下面三个方法:

    -(void)delNumber;//退格
    -(NSString *)compute;//计算
    -(void)clearSpace;//清空输入

最后,ViewController需要做的是,将用户键入的字符“拼装”成字符串,然后交给Model去处理。

需要注意的地方

初始化calculator的实例对象
在viewDidLoad中,视图控制器初始化的时候要确保生成calculator(Model)的实例对象:

   self.calculator = [[Calculator alloc]init];

覆盖calculator的getter方法
保证每次都能得到一个对象,而不是一个空指针

(Calculator *)calculator

  {
      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。

效果图

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/15553.html

相关文章

  • 基于iOS简单算器(二)

    摘要:接上一篇基于的简单计算器一皆为主课程的实验内容。体质计算器获取用户的身高体重后,反馈用户的体质指数。由于可以用之前写好的类,所以新建的类继承自该类,然后只要再添加一些用于高级计算的方法即可。 接上一篇基于iOS的简单计算器(一)皆为po主iOS课程的实验内容。 新增界面 高级计算器:能够进行一些高级的运算比如三角函数、阶乘、对数等。 体质计算器:获取用户的身高体重后,反馈用户的体质指...

    Barrior 评论0 收藏0
  • 如何实现分析去中心化客户行为分析平台

    摘要:本期主题如何实现分析去中心化的客户行为分析平台嘉宾介绍孔淼,诸葛创始人连续创业者,毕业于华中科技大学,前。 极牛技术分享活动 极牛技术实践分享系列活动是极牛联合顶级VC、技术专家,为企业、技术人提供的一种系统的线上技术分享活动。 每期不同的技术主题,和行业专家深度探讨,专注解决技术实践难点,推动技术创新。隔周三20点通过极牛线上技术分享群准时开课。欢迎各个机构、企业的行业专家、技术人报...

    lufficc 评论0 收藏0
  • 深度揭秘腾讯云数据库技术7年变迁史

    摘要:真正云原生数据库技术解析年,在腾讯云服务了百万客户之后,腾讯云数据库迎来了突破。由开源数据库适配业务和具体场景,腾讯云自主研发了一款真正的云原生数据库。作为腾讯云在数据库领域的重要布局,单节点读性能可以达到万,全面超越业内目前最高的万水平。 早在上个世纪50、60年代,数据二字就已不再是简单的数字信息而已。随着信息技术的不断发展,在计算机应用领域,计算机存储和处理的对象逐渐广泛,表示这...

    MartinHan 评论0 收藏0
  • 技术培训 | 大数据分析处理与用户画像实践

    摘要:孔淼大数据分析处理与用户画像实践直播内容如下今天咱们就来闲聊下我过去接触过的数据分析领域,因为我是连续创业者,所以我更多的注意力还是聚焦在解决问题和业务场景上。在对微博数据进行上面提到的计算分析之前,我们其实还做了很多数据处理的工作。 孔淼:大数据分析处理与用户画像实践 直播内容如下: 今天咱们就来闲聊下我过去接触过的数据分析领域,因为我是连续创业者,所以我更多的注意力还是聚焦在解决问...

    XanaHopper 评论0 收藏0
  • 技术培训 | 大数据分析处理与用户画像实践

    摘要:孔淼大数据分析处理与用户画像实践直播内容如下今天咱们就来闲聊下我过去接触过的数据分析领域,因为我是连续创业者,所以我更多的注意力还是聚焦在解决问题和业务场景上。在对微博数据进行上面提到的计算分析之前,我们其实还做了很多数据处理的工作。 孔淼:大数据分析处理与用户画像实践 直播内容如下: 今天咱们就来闲聊下我过去接触过的数据分析领域,因为我是连续创业者,所以我更多的注意力还是聚焦在解决问...

    韩冰 评论0 收藏0

发表评论

0条评论

CatalpaFlat

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<