服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS实现计算器小功能

iOS实现计算器小功能

2022-07-29 11:01Ricardo.M.Jiang IOS

这篇文章主要介绍了iOS实现计算器小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了iOS实现计算器小功能,供大家参考,具体内容如下

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

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

知识点如下

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

效果如下

iOS实现计算器小功能

增加model文件

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

controll修改为

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/whuhan2013/article/details/52842191

延伸 · 阅读

精彩推荐
  • IOSiOS开发中常用的各种动画、页面切面效果

    iOS开发中常用的各种动画、页面切面效果

    这篇文章主要介绍了iOS开发中常用的各种动画、页面切面效果 的相关资料,需要的朋友可以参考下...

    jerrylsxu6152021-01-15
  • IOSiOS masonry的使用方法

    iOS masonry的使用方法

    这篇文章主要介绍了iOS masonry的基本使用方法的相关资料,文章还介绍了CocoaPods的安装过程,需要的朋友可以参考下面文字内容...

    轩墨️9992021-12-28
  • IOSiOS中 LGLAlertView 提示框的实例代码

    iOS中 LGLAlertView 提示框的实例代码

    这篇文章主要介绍了iOS中 LGLAlertView 提示框的实例代码非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    ljmaque9422021-02-03
  • IOSiOS实现Pad上菜单弹出界面

    iOS实现Pad上菜单弹出界面

    这篇文章主要为大家详细介绍了iOS实现Pad上菜单弹出界面的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    那一抹风情9152021-03-18
  • IOS浅析iOS的Xcconfig

    浅析iOS的Xcconfig

    本篇文章介绍IOS中Xcconfig的相关知识内容,有兴趣的朋友学习下吧。...

    iOS开发网6142021-04-16
  • IOSiOS手势的实现方法

    iOS手势的实现方法

    这篇文章主要为大家详细介绍了iOS手势的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    makingitbest8692021-03-09
  • IOSiOS组件封装与自动布局自定义表情键盘

    iOS组件封装与自动布局自定义表情键盘

    这篇文章主要介绍了iOS组件封装与自动布局自定义表情键盘的相关资料,需要的朋友可以参考下...

    iOS开发网4182021-01-17
  • IOSiPhoneX 媒体查询适配的方法教程

    iPhoneX 媒体查询适配的方法教程

    这篇文章主要介绍了iPhoneX 媒体查询适配的方法教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    杭州蘇小小7802021-05-18