5. 基本控制流

转载自http://wanwu.tech/2017/03/07/control-flow/

世界是复杂的,不是一个计算苹果价格那么简单,也不是说一句“我叫韩梅梅”就能解决的。面对复杂的情况,我们一般都是分情况讨论,如果这样,就这样做。如果那样,就那样做。

下面,我们首先解决怎么判断各种如果的方法。

为了知道怎么判断,我们需要知道怎么做比较,并得出什么是真,什么是假的结论。

比较

比较,就是比大小,使用比较操作符。如何显示比较结果呢,我们使用truefalse,即来表示结果。这种数据类型是Bool(布尔)。只有两种可能,真或者假。

let yes = true
let no = false

上面代码即swift声明并初始化了两个布尔常量。注意这里使用了类型推断。

布尔操作符

知道了怎么表示真假,那么如何判断呢?无非就是我们数学学过那些,比如相等,大于,小于一类的。

==: 相等

!=:不等

>:大于

>=:大于等于

<:小于

<=:小于等于

我们观察下这些布尔操作的值是什么:

let isTrueOrFalse = (4 == 5)

上面简单的试验了一个==,观察isTrueOrFalse值是什么?然后试试其他几个布尔操作符。

布尔运算

有了基本的布尔操作符,我们再来看下布尔运算的问题。简单来说,就是的问题。其中,&&||表示。

关于布尔运算,可以参考布尔运算,这里不做过多介绍。

如果

熟悉了基本的布尔运算,下一步就需要把它们用起来了。

比如表达“a比b大,那么就打印a”:

let a = 10
let b = 1
if a > b {
    print(a)
}

这里,我们使用了条件语句if,中文就是如果的意思。
其语法为:

if 条件成立(true) {
    则执行片段1
}
if后的内容

流程图如下:

可见,条件语句在if后的条件为的时候,才会执行片段1。

如果表达“a比b大,那么就打印a,否则就打印b呢”,我们可以这样:

let a = 10
let b = 1
if a > b {
    print(a)
} else {
    print(b)
}

其语法为如else理解为否则

if 条件1成立(true) {
    则执行片段1
} else {
    否则执行判断2
}
else后的内容

流程图如下:

对应的还有三元操作符,有兴趣自己查看。


如果表达“a比b大,那么就打印a,否则如果a和b相等,打印等于号,其他情况都打印b呢”,我们可以这样:

let a = 10
let b = 1
if a > b {
    print(a)
} else if a == b{
    print("=")
}
else {
    print(b)
}

其语法为:

if 条件1成立(true) {
    则执行片段1
} else if  条件2成立(true) {
    执行片段2
} else if  条件3成立(true) {
    执行片段3
} 
后面内容

上面可以读作:如果条件1成立,那么执行片段1。否则(在条件1不成立的情况下)如果条件2成立,执行片段2。否则(在条件2不成立的情况下)如果条件3成立,执行片段3。最后执行后面内容。

其流程图为:

练习

观察下面两个程序,判断打印什么?理解ifelse if的区别

// 1
let a = 10
let b = 10
if a >= b {
    print(a)
} else if a == b{
    print("=")
} else {
    print(b)
}
// 2
let a = 10
let b = 10
if a >= b {
    print(a)
} 
if a == b{
    print("=")
} else {
    print(b)
}

嵌套if else

下面,我们使用上面知识,设计一个根据输入数字,输出星期几的小程序:

let number = 1
let dayOfWeek: String

if number == 1 {
    dayOfWeek = "星期一"
} else if number == 2 {
    dayOfWeek = "星期二"
} else if number == 3 {
    dayOfWeek = "星期三"
} else if number == 4 {
    dayOfWeek = "星期四"
} else if number == 5 {
    dayOfWeek = "星期五"
} else if number == 6 {
    dayOfWeek = "星期六"
} else if number == 7 {
    dayOfWeek = "星期日"
} else {
    dayOfWeek = "您输入的数字我看不懂"
}
print(dayOfWeek)

更改number,看看都会输出什么。

短路

如果if和布尔运算结合使用会发生什么呢?观察下面代码:

let name = "小明"
if 1 > 2 && name == "小明" {
    print(name)
}

if 1 < 2 || name == "小红" {
    print(name)
}

我们发现,对于运算,1 > 2是假,那么不管后面的判断是真是假,并不影响整体的判断。所以后面的表达式不会执行。

类似的,对于运算,1 < 2是真,那么不管后面的判断是真是假,并不影响整体的判断。所以后面的表达式不会执行。

封装变量或者常量

if引入了一个新的概念:作用域
设想你去买苹果,一斤5块钱,但是如果你买5斤以上,那么新增的重量每斤4块钱。

let numberApple = 10
let price = 5
var totalPrice = 0

if numberApple <= 5 {
    totalPrice = numberApple * price
} else {
    let lowPrice = 4
    totalPrice = 5 * price
    totalPrice += (numberApple - 5) * lowPrice
}

print(totalPrice)

这段代码首先判断苹果数量。如果数量小于等于5,那么直接计算。否则,新建一个常量lowPrice,并设为4。总价等于两部分价格的总和。

注意,我们这里在else中引入了一个新的局部常量lowPrice。尝试在这段代码最后写下面代码:

print(lowPrice)

我们发现如下报错:

Use of unresolved identifier 'lowPrice'

这条错误说明提醒你lowPrice只能用在它所声明的范围内,这个范围就是作用域,其范围就是else后大括号包括的范围。超出这个范围,lowPrice不可见。

同时我们要注意到,在我们这个作用域的父作用域(也就是这个大括号外面的区域)声明的常量或变量,在此作用域仍然有效。

循环

假设我们要计算1到100的和,那么如果不用公式计算,应该怎么做呢?

var number = 2
let maxNum = 100
var sum = 1

while number <= maxNum {
    sum += number
    number += 1
}

print(sum)

这个过程可以理解为:number初始为第二个数字,maxNum是最大的数字,sum初值为第一个数字。然后先计算第一个与第二个数字之和并存为sum,再计算sum与第三个数字的和,一直计算到number变为100。

while语法为:

while <条件> {
    <循环代码E>
}

只要条件为真,循环代码就会循环往复执行。如果为假,那么就会跳出循环向后运行。

有时候,你可能想要提前终止循环,那么可以使用break

var number = 2
let maxNum = 100
var sum = 1

while number <= maxNum {
    sum += number
    number += 1
    if sum > 100 {
        break
    }
}

print(sum)

我们可以发现,一旦sum大于100,循环就会提前终止。

类似的,我们还可以使用repeat,其语法:

repeat {
    <循环代码>
} while <条件>

在这个结构中,先无条件执行循环代码,然后判断条件,如果成立,再次去执行循环代码,如果不成立,退出循环。

以上代码可改为:

var number = 2
let maxNum = 10
var sum = 1

repeat {
    sum += number
    number += 1
} while(number <= maxNum)

print(sum)

练习

计算1到100的阶乘

总结

  1. 布尔操作
  2. 条件判断
  3. 循环

下一步

深入理解为什么使用循环

你可能感兴趣的:(5. 基本控制流)