Lesson 2

2015-12-27  本文已影响20人  SheBang_

课程二最终完成了计算机的编写,下图是计算器的程序:


屏幕快照 2015-12-27 22.56.46.png

首先看下按下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将乘积压入栈中。


屏幕快照 2015-12-27 21.53.28.png

但是这么写,代码太冗余了,dirty。我们创建一个函数preformOperate,它的参数呢是另外一个函数(这个函数的如参是两个Double类型的参数,返回一个Double的参数),我们把乘法的函数单独剥离出来了,不然写在preformOperate中(我擦,我又拼错了。。。。),又是更刚才一样四种运算就要写四种,有很多段冗余的代码。


屏幕快照 2015-12-27 22.09.57.png

1.Swift中可以隐式的将一个方法作为另一个方法的参数,所以可以这样简化,形成闭包,但是要用花括号将函数包裹住,函数体部分要用in跟前面的参数分开:


屏幕快照 2015-12-27 22.39.52.png

2.swift中可以根据上下文进行判断,参数的类型,所以我们可以省去op1等的参数声明,包括返回值的类型,return也可以省掉。


屏幕快照 2015-12-27 22.45.24.png

3.Swift中编译器会自动给方法中的参数传一个默认值,第一个参数$0,第二个参数$1,不需要声明参数名字,参数名字也可以省略。


屏幕快照 2015-12-27 22.47.52.png

4.Swift中如果一个方法是另外一个方法的最后一个参数,那么可以将此方法放到原方法后面:


屏幕快照 2015-12-27 22.49.15.png

5.方法中没有别的参数,那么连这个“()”都可以省略了:


屏幕快照 2015-12-27 22.49.41.png

最终就形成了最开始的那个简洁的代码。

关于闭包,详见http://www.jianshu.com/p/a7d6e2a3a1b3,没有学完呢,后面补上。

上一篇 下一篇

猜你喜欢

热点阅读