swift-计算器(斯坦福公开课)

看了斯坦福老头的课,真心觉得,我的中文怎么也变的这么垃圾了。是关于iOS8的课程,用swift写的,一个计算器应用的制作,看看人家的课,再看看咱们学校的课(不过垃圾学校,纯粹觉得大学浪费了),废话啊,废话,继续废话。那个老头的代码有些我给省略了,不知道会出现什么问题,反正我是没有发现,如果你发现了,请告诉我。还有就是这个计算器的具体操作步骤是,你先4-> 回车-> 5-> 回车 ->乘号 显示计算结果20

首先是界面的搭建,就是0-9一共10个按钮,然后加减乘除四个操作按键,以及,一个回车键(用来将所输入的数存放在栈中,反正老头是这样说的,他把输入进去的数存放到了一个数组中了var operandStack = Array<Double>(),还有就是一个用来显示输入的数以及输入结果的label了。这些都是在故事板中进行的(当然除了那个数组),然后将label与代码关联

@IBOutlet weak var resultLabel: UILabel!

//事实上,在这里指明类型被认为是不好的书写方式,如果可以推断出类型 ,你就应该让编译器自己去推断

    //var isStart :Bool = false

    var isStart = false //用户是不是已经输入,那个老外用了一长串的字符userIsInTheMiddleOfTypingANumber

将0-9这10个数的点击事件与代码关联

@IBAction func buttonTap(sender: UIButton) {

        let digit = sender.titleLabel?.text// 注意这个digit是一个可选值(opentional),就是你点击的按钮上的数字,

        if isStart{

        resultLabel.text = resultLabel.text! + digit! //可选值是不可以拼接字符串的,所以在这个地方,需要进行解包

        }else{

        resultLabel.text = digit//用户第一次点(我这样理解的),结果框显示你按的那个数

        isStart = true//这个是说用户已经开始输入了

        }

    }

 var operandStack = Array<Double>()

    //这个变量是一个内部的栈,去存储你输入的这些数,他的类型是一个数组,这个数组里存放的是Double的变量,注意在这个地方要初始化,(我们不能使用没有经过初始化的,会报错)

    @IBAction func enter() {

        isStart = false //因为我们在点完enter的时候,需要将刚才输入的数放到栈里,并且输第二个数,所以需要将这个布尔值设为false

//        var value = (resultLabel.text! as NSString).doubleValue

        operandStack.append(resultValue)

        println("operandStack: (operandStack)")

    }

    

    //计算型属性

    var resultValue:Double{

        get{

        return NSNumberFormatter().numberFromString(resultLabel.text!)!.doubleValue

        }

         set{

        resultLabel.text = "(newValue)" //newValue是系统的,就是想要设置的那个值       2将double类型转换为字符串

//            isStart = false// 这句话写在这不知道是什么意思,该怎么理解呢

        }

    

    }

    @IBAction func operate(sender: UIButton) {

        let operation = sender.currentTitle!

        switch operation{

//            case "✖️" : performOperation { $1 * $2 }

            case "✖️": performOperation { $0 * $1} //这个地方,这地方真心坑,$0 * $1,我还以为传进入随便两个数就行了呢,那老头对这段代码不断的简化简化,才写成了这样,明天把简化的过程单独整理出来(明日复明日啊)

            case "➗" : performOperation { $1 / $0 }

            case "➖" : performOperation { $1 - $0 }

            case "➕" : performOperation { $1 + $0 }

            

        default:break

            

        }

    

    }

    

    

    func performOperation(operation:(Double,Double)->Double){//函数的参数是一个函数

        if operandStack.count >= 2{

            resultValue = operation(operandStack.removeLast() , operandStack.removeLast())//operandStack.removeLast()难道说,这个方法删除并返回了最后一个数?

        }

        

    }

    

//    func multipy(op1:Double,op2:Double)->Double{

//    

//        return op1 * op2

//    }

    

原文地址:https://www.cnblogs.com/mudy/p/4822605.html