课程二最终完成了计算机的编写,下图是计算器的程序:
首先看下按下enter键做了什么,构造了这么一个无参数的函数,函数体内,首先设定using为false,然后将displayValue存进数组中,也就是说当我们按下enter键的时候,屏幕上的数字就被存进了数组中,然后using设定成false,下次我们再点击别的数字的时候,就会进入appendDigit的else中,屏幕上就会出现新按下的数字取代刚才的数字。
@IBAction func enter() {
using = false
oprandStack.append(displayValue)
print("oprandStack = \(oprandStack)")
}
新增了运算符号(加减乘除)程序如下图,拖拽控件到ViewController中,构造一个opetate的函数(我擦,我拼写错了。。。。)。什么情况下using的值是true?当用户点击数字且没有按下enter键的时候。那么下图中的
if using {
enter()
}
的含义就是,当用户还在输入的时候,我们按下了运算符号,这时候,我们将用户刚才输入的值,压入栈中。
然后我们用了一个switch来判断运算符号,进行相应的流程控制。举个例子,当是乘号的时候,displayValue被赋值最后两个被压入栈中的数字相乘,然后再enter将乘积压入栈中。
但是这么写,代码太冗余了,dirty。我们创建一个函数preformOperate,它的参数呢是另外一个函数(这个函数的如参是两个Double类型的参数,返回一个Double的参数),我们把乘法的函数单独剥离出来了,不然写在preformOperate中(我擦,我又拼错了。。。。),又是更刚才一样四种运算就要写四种,有很多段冗余的代码。
1.Swift中可以隐式的将一个方法作为另一个方法的参数,所以可以这样简化,形成闭包,但是要用花括号将函数包裹住,函数体部分要用in跟前面的参数分开:
2.swift中可以根据上下文进行判断,参数的类型,所以我们可以省去op1等的参数声明,包括返回值的类型,return也可以省掉。
3.Swift中编译器会自动给方法中的参数传一个默认值,第一个参数$0,第二个参数$1,不需要声明参数名字,参数名字也可以省略。
4.Swift中如果一个方法是另外一个方法的最后一个参数,那么可以将此方法放到原方法后面:
5.方法中没有别的参数,那么连这个“()”都可以省略了:
最终就形成了最开始的那个简洁的代码。
关于闭包,详见http://www.jianshu.com/p/a7d6e2a3a1b3,没有学完呢,后面补上。