第5章
控制流
本章主要介绍Swift中的各种循环控制语句,包括for语句、while及repeatwhile语句、if条件语句、switch条件语句及控制流中的跳转语句。
5.1for循环
在前面的章节已经接触到forin循环了,这里将进行深入系统的讨论。for循环是指按照指定次数重复执行一系列语句的操作。for循环有两种形式,即forin循环和for条件递增循环。
forin循环主要用来遍历一个特定范围内的所有元素,例如一个集合、一个数字范围、一个字符串或者一个数组。
图5.1forin遍历闭区间
如图5.1所示,遍历了1~6的闭区间里的所有整数,这里的整型变量i不需要显式声明,它是在循环的声明语句中被隐式声明的。每次循环的时候,i被赋值为1~6的数,在循环体内可以被引用。
当不需要知道每次循环时变量的值时,可以使用下画线“_”来代替变量名。如图5.2所示,这里需要注意的是,当用下画线来代替变量后,实际上forin循环已经变成了重复一定的次数执行循环体内的语句,而不需要循环范围中遍历的值参与循环体的执行。
Chapter 5第5章控制流
图5.2下画线代替变量名
forin循环遍历数组、字典、集合的实例可参考前面相关的章节,这里不再作重复介绍。
for条件递增循环主要用来重复执行一系列语句直到特定条件达成,一般的做法是: 每次循环后增加计数器的值,当计数器的值达到特定值后结束循环。
for条件递增循环的格式为forinitialization;condition;increment {
statements
}该循环语句的执行过程是: 第一步进行条件控制变量的初始化,即执行initialization部分的语句。第二步,执行条件判断语句condition,结果为布尔值。当结果为false时,循环结束,继续执行for循环以外的后续语句;当结果为true时,执行循环体内的语句statements。第三步,执行递增语句,即increment语句,完成后跳回第二步继续执行。实例如图5.3所示。
图5.3for条件递增循环实例
5.2while循环
while循环就是重复执行一系列语句,直到条件语句值为false。while循环在循环执行一系列语句前先进行条件语句的判断,若为false则结束循环,若为true则继续执行循环体内语句。Swift还提供了while循环的一种变体,即repeatwhile循环,它首先执行循环体内的一系列语句,然后进行条件语句的判断,若为false则结束循环,若为true则继续执行循环体内的语句。
while循环的格式为while condition {
statements
}repeatwhile循环的格式为repeat {
statements
} while condition如图5.4所示,while循环和repeatwhile循环的判断条件相同,都是i<5,执行的结果也一致。
图5.4while循环和repeatwhile循环
5.3if条件语句
if条件语句在前面的章节已经多次使用了,相信读者已经非常熟悉了。if条件语句的格式为ifcondition{
statements
} else {
statements
}其中,else语句还可以继续嵌套新的ifelse语句,嵌套的数量没有限制。例如: ifcondition1{
statements
} else if condition2{
statements
} else {
statements
}嵌套的if条件语句的实例如图5.5所示,其中定义了一个字符串变量weather,用来保存当前的季节信息,赋初值为autumn。通过层层嵌套ifelse语句,分别判断weather为四季中的哪一个,并打印相应的季节提示信息。
图5.5嵌套的if条件语句
5.4switch条件语句
switch条件语句将一个值与若干个可能匹配的模式进行比较。执行第一个匹配成功的模式所对应的代码。图5.6中的ifelse嵌套语句在情况比较多的时候可以用switch语句来替代,在形式上会简化很多,可读性也有很大提高。
switch语句的格式如下: switchsomeValue {
casevalue1:statementsFor1
casevalue2, value3:statementsFor23
default:statementsForDefault
}图5.6switch条件语句
switch语句中包含了多个case,每个case对应一个匹配的条件或模式,也对应一个特定的执行语句。这里需要注意的是,switch语句中所列出的各种匹配模式必须是完备的,也就是说各种case情况必须包含someValue的所有可能值。当只想对部分特定情况进行比较和处理时,可以用default语句来处理其他没有出现在case中的可能情况(或值)。需要特别注意的是,switch语句在执行过程中,当第一次与某个case条件匹配,执行该case中对应的语句后,就直接跳出并执行switch块的后续语句,而不会继续与其他case条件进行比较。这一点是与C语言的差别。在C语言中,会显式地使用break跳出switch块。
如图5.6所示,首先定义了一个枚举类型month,包括12个月份的英文单词。然后定了一个month类型的变量curMonth,表示当前的月份,然后赋值为month.February,表示当前月份为2月。switch语句对curMonth进行条件匹配,分别列出了4个匹配值。第一个条件为month.January,第二个条件为month.February,第三个条件为3个值: month.April、month.May、month.June。只要和其中一个值相等即匹配成功。第四个条件为默认值,如果和前面的3个条件都不匹配,则自动执行默认条件相应的语句。
switch语句中case部分的条件也可以是一个范围。如图5.7所示,将上面的例子修改一下,用整型来表示月份。case语句分别对1~3月和4~6月进行比较。
图5.7switch语句对整型数值范围进行值的匹配
switch语句也可以对元组进行值的匹配。如图5.8所示,classInfo是一个课程信息的元组,包括开课年份和课程名称两个信息。通过switch语句对元组classInfo中的信息进行比较,根据不同情况,打印出相应的课程信息。
图5.8switch语句对元组进行值的匹配
switch语句中的case可以进行值绑定,即,将某个case匹配的值绑定到一个临时变量或者常量上,然后在该case的执行语句中就可以引用绑定的变量或常量了。如图5.9所示,在case中分别将开课年份和课程名称的值绑定到常量x和y上,并在case块的执行语句中引用这两个常量。
在值绑定的基础上,case的匹配语句可以引入where语句来构造更加复杂的比较语句。如图5.10所示,where语句对特定条件进行筛选,匹配时才会执行后续语句。
图5.9case的值绑定
图5.10在case中引入where进行条件筛选
5.5控制转移语句
控制转移语句就是改变原有代码的执行顺序,实现代码的跳转。这里主要介绍两个常用的控制转移语句: continue语句、break语句。其他的控制转移语句读者可根据需要查找Swift官方文档。
continue语句在循环语句中使用,当执行continue语句时,本次循环结束,继续下一次循环的执行。如图5.11所示,在forin循环语句中,当i=4的时候执行continue语句,直接结束本次循环,并继续下一个循环,即本次循环中的打印语句将不会执行。
图5.11continue语句
break语句可以用于循环语句中,也可以用于其他的控制流语句中。当执行break语句时,直接终止当前控制流,并跳到控制流以外的后续语句处继续执行。它和continue语句在循环语句中应用时的差别是,break语句终止全部后续的循环语句,而continue只是结束当次循环语句的执行。如图5.12所示,当i=4的时候,终止后续所有的循环执行语句,直接跳出循环。因此,循环只执行了3次。
图5.12break语句
……