本文利用ios实现计算器app,后期将用mvc结构重构

  1. import UIKit
  2. class CalculViewController: UIViewController {
  3. @IBOutlet weak var display: UILabel!
  4. var userIsInTheMiddleOFTypingANumber:Bool=false
  5. @IBAction func appendDigit(sender: UIButton) {
  6. let digit=sender.currentTitle!
  7. if userIsInTheMiddleOFTypingANumber {
  8. display.text=display.text!+digit
  9. }else{
  10. display.text=digit
  11. userIsInTheMiddleOFTypingANumber=true
  12. }
  13. }
  14. var operandstack:Array<Double>=Array<Double>()
  15. @IBAction func operate(sender: UIButton) {
  16. let operation=sender.currentTitle!;
  17. if userIsInTheMiddleOFTypingANumber {
  18. enter()
  19. }
  20. switch operation {
  21. case "×":performeOperation{$0*$1}
  22. case "÷":performeOperation{$1/$0}
  23. case "+":performeOperation{$0+$1}
  24. case "-":performeOperation{$1-$0}
  25. case "√":performeOperation{sqrt($0)}
  26. default:
  27. break
  28. }
  29. }
  30. // func multiply(op1:Double,op2:Double) -> Double {
  31. // return op1*op2;
  32. // }
  33. func performeOperation(operation:(Double,Double)->Double){
  34. if operandstack.count>=2 {
  35. displayValue=operation(operandstack.removeLast(),operandstack.removeLast())
  36. enter()
  37. }
  38. }
  39. private func performeOperation(operation:Double->Double){
  40. if operandstack.count>=1 {
  41. displayValue=operation(operandstack.removeLast())
  42. enter()
  43. }
  44. }
  45. @IBAction func enter() {
  46. userIsInTheMiddleOFTypingANumber=false
  47. operandstack.append(displayValue)
  48. print("operandstack=\(operandstack)")
  49. }
  50. var displayValue:Double{
  51. get{
  52. return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
  53. }
  54. set{
  55. display.text="\(newValue)"
  56. userIsInTheMiddleOFTypingANumber=false
  57. }
  58. }

知识点如下

  • 计算型属性的setter与getter
  • swift利用函数作为参数
  • swift的重载,详情参见:swift override

效果如下

增加model文件

  1. import Foundation
  2. class CalculatorBrain {
  3. private enum Op : CustomStringConvertible{
  4. case operand(Double)
  5. case UnaryOperation(String,Double->Double)
  6. case BinaryOperation(String,(Double,Double)->Double)
  7. var description:String{
  8. get{
  9. switch self {
  10. case .operand(let operand):
  11. return "\(operand)"
  12. case .BinaryOperation(let symbol,_):
  13. return symbol
  14. case .UnaryOperation(let symbol, _):
  15. return symbol
  16. }
  17. }
  18. }
  19. }
  20. private var opstack=[Op]()
  21. private var knowOps=[String:Op]()
  22. init(){
  23. func learnOp(op:Op){
  24. knowOps[op.description]=op
  25. }
  26. learnOp(Op.BinaryOperation("×"){$0*$1})
  27. learnOp(Op.BinaryOperation("÷"){$1/$0})
  28. learnOp(Op.BinaryOperation("+"){$0+$1})
  29. learnOp(Op.BinaryOperation("-"){$1-$0})
  30. learnOp(Op.UnaryOperation("√"){sqrt($0)})
  31. // knowOps["×"]=Op.BinaryOperation("×"){$0*$1}
  32. // knowOps["÷"]=Op.BinaryOperation("÷"){$1/$0}
  33. // knowOps["+"]=Op.BinaryOperation("+"){$0+$1}
  34. // knowOps["-"]=Op.BinaryOperation("-"){$1-$0}
  35. // knowOps["√"]=Op.UnaryOperation("√"){sqrt($0)}
  36. }
  37. private func evaluate(ops:[Op])->(result:Double?,remainOps:[Op]){
  38. if !ops.isEmpty {
  39. var remainOps=ops;
  40. let op=remainOps.removeLast()
  41. switch op {
  42. case Op.operand(let operand):
  43. return(operand,remainOps)
  44. case Op.UnaryOperation(_, let operation):
  45. let operandEvalution=evaluate(remainOps)
  46. if let operand=operandEvalution.result{
  47. return(operation(operand),operandEvalution.remainOps)
  48. }
  49. case Op.BinaryOperation(_, let operation):
  50. let operandEvlution1=evaluate(remainOps)
  51. if let operand1=operandEvlution1.result {
  52. let operandEvlution2=evaluate(operandEvlution1.remainOps)
  53. if let operand2=operandEvlution2.result {
  54. return (operation(operand1,operand2),operandEvlution2.remainOps)
  55. }
  56. }
  57. }
  58. }
  59. return (nil,ops)
  60. }
  61. func evaluate()->Double?{
  62. let (result,remainder)=evaluate(opstack)
  63. print("\(opstack)=\(result)with\(remainder)left over")
  64. return result
  65. }
  66. func pushOperand(operand:Double)->Double?{
  67. opstack.append(Op.operand(operand))
  68. return evaluate()
  69. }
  70. func performOperation(symbol:String)->Double?{
  71. if let operation=knowOps[symbol]{
  72. opstack.append(operation)
  73. }
  74. return evaluate()
  75. }
  76. }

controll修改为

  1. import UIKit
  2. class CalculViewController: UIViewController {
  3. @IBOutlet weak var display: UILabel!
  4. var userIsInTheMiddleOFTypingANumber:Bool=false
  5. var brain=CalculatorBrain()
  6. @IBAction func appendDigit(sender: UIButton) {
  7. let digit=sender.currentTitle!
  8. if userIsInTheMiddleOFTypingANumber {
  9. display.text=display.text!+digit
  10. }else{
  11. display.text=digit
  12. userIsInTheMiddleOFTypingANumber=true
  13. }
  14. }
  15. //var operandstack:Array<Double>=Array<Double>()
  16. @IBAction func operate(sender: UIButton) {
  17. if userIsInTheMiddleOFTypingANumber {
  18. enter()
  19. }
  20. if let operation=sender.currentTitle{
  21. if let result=brain.performOperation(operation) {
  22. displayValue=result
  23. }else{
  24. displayValue=0
  25. }
  26. }
  27. }
  28. @IBAction func enter() {
  29. userIsInTheMiddleOFTypingANumber=false
  30. if let result=brain.pushOperand(displayValue){
  31. displayValue=result
  32. }else{
  33. displayValue=0
  34. }
  35. }
  36. var displayValue:Double{
  37. get{
  38. return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
  39. }
  40. set{
  41. display.text="\(newValue)"
  42. userIsInTheMiddleOFTypingANumber=false
  43. }
  44. }
  45. }

IOS之计算器实现的更多相关文章

  1. iOS小型计算器

    // //  ViewController.m //  计算器 //屏幕的宽和高 #define SCREEN_W self.view.frame.size.width #define SCREEN_ ...

  2. IOS OC 计算器算法(不考虑优先级)

    个人见解:为还在计算器算法方面迷惑的同学一个数据处理解决方案:定义一个可变数组array,一个可变字符串str,使字符通过[array addObject:str];方法添加到可变数组,每当触发运算符 ...

  3. iOS 收款计算器算法

    一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面 demo 在这里 https://github.com/L-vinCent/calculView_function 显示计算记录 不能连续 ...

  4. iOS 减法计算器

    一: 在界面上拖入相应的控件 二: 给每个控件设置关联 //监听按钮的点击 - (IBAction)compute:(id)sender; //第一个文本输入框的值 @property (weak, ...

  5. c 语言简单计算器源码

    //  main.c //  计算器 //  Created by qianfeng on 14-7-15. //  Copyright (c) 2014年 ___FGY___. All rights ...

  6. 使用Olami SDK 语音控制一个支持HomeKit的智能家居的iOS程序

    前言 HomeKit是苹果发布的智能家居平台.通过HomeKit组件,用户可以通过iphone.iPad和ipod Touch来控制智能灯泡,风扇.空调等支持HomeKit的智能家居,尤其是可以通过S ...

  7. 【IOS开发笔记03-视图相关】简单计算器的实现

    UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

  8. 李洪强漫谈iOS开发[C语言-042]-简单计算器

    李洪强漫谈iOS开发[C语言-042]-简单计算器

  9. IOS实现小型计算器

    作为一名初学者,编辑一款能够在IOS操作系统上运行的计算器是一件很值得自豪的事情,网络上虽然后很多相关的文章和代码,功能也很强大但是我感觉相关的计算器比加复杂,晦涩难懂,所以我想通过这个小小的计算器, ...

随机推荐

  1. mysql:You can't specify target table 'bpm_tksign_data' for update in FROM clause

    UPDATE bpm_tksign_data WHERE actinstid ' AND nodeid = 'SignTask1' AND batch = ( SELECT max(a.batch) ...

  2. Codeforces 271 Div 2 A Keyboard

    题目链接:http://codeforces.com/contest/474/problem/A 解题报告:一个矩形的键盘,上面只有规定的字符,现在按的时候总是会向某个方向按偏,也就是输入一串字符后, ...

  3. Merge k Sorted Lists Leetcode Java

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 使 ...

  4. 简述JavaScript函数节流

    为什么要用函数节流 浏览器中某些计算和处理要比其他的昂贵很多.例如,DOM 操作比起非 DOM 交互需要更多的内存和 CPU 时间.连续尝试进行过多的 DOM 相关操作可能会导致浏览器挂起,有时候甚至 ...

  5. cvGet2D的用法

    CvScalar s;s = cvGet2D(src, j,i);//获取src图像中坐标为(i,j)的像素点的值s.val[0] 代表src图像BGR中的B通道的值~int nXY = cvGet2 ...

  6. wamp开机自启动

    其实非常简单!打开服务管理,把以下两个服务,由手动(默认状态)改为自动即可: wampapache wampmysqld

  7. Python自动化之线程进阶篇

    拓展知识 什么是CPU-bound(计算密集型) 和I/O bound(I/O密集型) ? I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CP ...

  8. Tomcat异常 Multiple Contexts have a path of "/qqshl".解决方法

    Tomcat异常 Multiple Contexts have a path of "/qqshl".解决方法 找到tomcat映射文件Service.xml,将文件中的conte ...

  9. 8.eclipse调试smali

    一.重打开包APK 1.apktool解包文件 apktool d -d XXX.apk 这里注意使用-d参数,生成的smali文件才是以java结尾的,才能被eclipse识别 2.找到Androi ...

  10. 详解 Too many open files

    运行在Linux系统上的Java程序可能会出现"Too many open files"的异常情况,且常见于高并发访问文件系统,多线程网络连接等场景. 程序经常访问的文件.sock ...