和所有其它编程语言一样,为了能够控制程序的执行路径,Swift提供了我们熟悉的循环和分支判断语句。它们大多和字面上的直观表意相同,在这一节中,我们就快速过一遍它们的基本用法。
条件分支判断语句
第一个要介绍的,是if...else if...else...。这是几乎每种语言都支持的分支表达方式,其中else if和else都是可选的部分,它们可以单独和if搭配形式各种分支条件的判断。基本上,看到代码,我们就可以直接了解这类判断的含义了。
var light = "red"
var action = ""
if light == "red" {
action = "stop"
}
else if light == "yellow" {
action = "caution"
}
else if light == "green" {
action = "go"
}
else {
action = "invalid"
}
在上面这个红绿灯的代码里,我们不断根据light的值,设置了变量action的值,它很简单。但通常,我们还是更多会使用if...else...表示非黑即白这样的简单关系。
对于上面这种存在多种可能性的情况,在Swift里,我们通常还是会使用switch...case...来表示,它比if...else...更安全,也更有更好的表意:
switch light {
case "red":
action = "stop"
case "yellow":
action = "caution"
case "green":
action = "go"
default:
action = "invalid"
}
这里,我们使用switch...case...表达了和之前的if...else...相同的语义。但是,它更明确的表达了当light的值(switch)为各种情况(case)时,我们应该采取哪些措施,这样的概念。
但和C++/Java这样语言相比,Swift中的switch...case...也有一些自己独特的地方:
首先,case语句必须exhausitive,也就是说,必须覆盖switch后面出现的表达式的所有情况,否则会导致编译错误。例如,我们去掉default,就会得到下面的错误:
因此,当你不需要对列出case的其他情况作出处理时,你也要在default分支写上一句break,明确表示你考虑到了其他的情况,只是你不需要更多额外处理而已。
其次,每个case语句不会自动“贯通”到下一个case,因此我们也无需在每个case最后一行写break表示结束;
最后,当我们要在一个case里匹配多个条件的时候,可以使用逗号把多个条件分开,在后面的视频里,我们会看到这个用法。
以上,就是和分支条件相关的两个最基本的场景和用法,接下来,我们了解循环。
循环控制语句
第一个要介绍的,是for element in collection/range,我们可以用它来方便的遍历一个集合类型或者范围:
let vowel = ["a", "e", "i", "o", "u"]
for char in vowel {
print(char)
}
// aeiou
for number in 1...10 {
print(number)
}
// 12345678910
要说明的是,传统C风格的三段式for循环,已经在Swift 3中被移除了:
// DO NOT use this style of for loop
// for var i = 0; i < 10; i += 1 {
// print(i)
// }
第二个循环的方式是while,它有前置判断和后置判断两种形式,基本上保留了原汁原味的C用法:
// while
var i = 0
while i < 10 {
print(i)
i += 1
}
// do ... while
repeat {
print(i)
i -= 1
} while i > 0
在这两类循环里,我们都可以用continue来停止执行当前循环中的语句,立即开始下一次循环。例如,打印所有的偶数:
for number in 1...10 {
if number % 2 != 0 { continue }
print(number)
}
// 2 4 6 8 10
在这个例子里,如果number是奇数,就会执行到continue,当前循环就停止并自动进入下一次循环了。
或者,我们也可以使用break来终止整个循环。例如,值大于8时,就终止循环:
for number in 1...10 {
if number > 8 { break }
print(number)
}
// 1 2 3 4 5 6 7 8
What's next?
以上,就是Swift中代码分支和循环最基本的用法。面对我们日常可能需要判断的各种复杂的情况,Swift从函数式编程中借鉴了很多匹配复杂条件的方法,力图帮助我们从拼接各种复杂的逻辑条中解放出来,进而让代码呈现更好的语义表现方式。在下一节中,我们就来了解下Swift中丰富的条件匹配方式。