前言
- 指令的执行顺序在程序结构中,我们称之为控制流。控制流,也称为控制结构,通常包括:顺序结构、条件结构、循环结构、转向结构。
1、条件分支结构
1.1 if 语句
-
1)
if
语句-
Swift 中的
if-else
和结构和 C 语言以及 OC 中的结构相似,只不过判断语句不需要写在小括号中。if condition { statements 1 } else { statements 2 }
-
-
2)
if-let
语句,值绑定-
if-let
语句是 Swift 提供的一种更安全的可选型解包方式 “可选绑定” 语句。if let 常量 = 可选型变量 { statements 1 } statements 2
if var 常量 = 可选型变量 { statements 1 } statements 2
-
如果 “可选型变量” 有值,即不为
nil
时,对 “可选型变量” 解包并给其一个 “别名”(语句中的常量/变量),在if
后的大括号对中 “别名” 才有效果。 -
如果 “可选型变量” 无值,即为
nil
时,那么大括号对中的代码不会执行,使可选解包程序不会崩溃。
-
1.2 guard 语句
-
1)
guard-else
语句-
在 Swift 2.0 中引入了用来进行判断的关键字
guard
,与if
类似,不过与if-else
不同的是,guard-else
结构先处理不符合guard
中判断条件的情况,最后处理条件为真时的操作。guard condition else { statements 1 return } statements 2
-
guard
的引入是因为当需要判断多个条件的时候,if-else
结构只能通过嵌套的方式排列所有的判断条件,而使用guard
后可以使嵌套结构变成顺序执行的结构。 -
当判断条件为假时必须在大括号中使用
return
或者break
提前终止代码。
-
-
2)
guard-let-else
语句,值绑定-
guard-let-else
语句是 Swift 提供的一种更安全的可选型解包方式 “可选绑定” 语句。guard let 常量 = 可选型变量 else { statements 1 return } statements 2
guard var 变量 = 可选型变量 else { statements 1 return } statements 2
-
guard-let-else
首先处理 “可选型变量” 为nil
时的情况,在此种情况下必须在大括号中使用return
或者break
提前终止代码。 -
如果 “可选型变量” 有值,那么 “可选型变量” 的值也会被保存在 “别名”(语句中的常量/变量)中,不管有多少个
guard-let-else
,“别名” 的作用域都在最外层。
-
1.3 switch 语句
-
1)
switch
语句-
switch
语句会把需要检验的值与若干中情况进行匹配,一旦匹配就会执行这种情况下的代码。switch value { case value1: statements 1 case value2: statements 2 default: statements 3 }
-
和 OC 中的
switch
语句不同,在switch
语言中你不需要在case
块中显式的使用break
语句跳出switch
,当匹配到的case
块中的代码块中的代码执行完毕后,程序会终止switch
语句,而不会继续执行下一个case
块。 -
可以使用
fallthrough
在switch
语句中使代码继续执行到下一个case
中的代码,而不会检查它下一个将会落入执行的case
中的条件是否匹配,从而达到和 C 语言标准中switch
语句特性一样的效果。fallthrough
不能用在下一个case
中有变量的情况,如case
中出现let
。 -
switch
语句允许多个case
匹配同一个值,不过如果存在多个可匹配分支的时候,只会执行第一个被匹配到的case
块。 -
在
switch
语言中每一个case
块都必须包含至少一条语句。 -
如果
case
能够包含switch
中的所有情况,那么没有default
也是可以的。 -
在
switch
语言中每个case
块后的匹配条件可以有多个,也可以是范围,每个匹配条件之间用逗号隔开。switch
语句不会同时匹配大些字母和小写字母。 如:case 1, 2, 3, 4, 5
,let a = 85 switch a { case 1..<80: print("bad") case 80..<90: print("good") default: print("OK") }
-
可以使用元组在同一个
switch
语句中匹配多个值,元组中的元素可以是值,也可以是范围。let a = (1, 1) switch a { case (0, 0): print("00 坐标") case (0, 1): print("01 坐标") default: print("OK") }
-
2、循环结构
2.1 for 循环语句
-
1)
for-in
语句-
在 Swift 中最常使用的
for
循环是for-in
结构,并且可以和范围(...
和..<
)配合使用。for 循环变量 in <范围,集合,队列...> { statements }
-
当不需要使用范围内的每一项的值时,可以使用下划线
_
作为循环变量名来忽略对值的访问。 -
遍历字典时,字典的每项元素会以
(key, value)
元组的形式返回。 -
循环变量不需要使用
var
声明。for num in 0...10 { print(num) }
-
-
2)
for
语句-
在 Swift 3.0 中 C 语言样式的
for
循环语句被废弃。Range、Array、Dictionary
都可以使用for-in
循环。for initialization; condation; increment { statements }
-
initialization
:初始化表达式,condation
:循环条件,increment
:改变循环条件的表达式。
-
2.2 while 循环语句
-
1)
while
语句-
while
循环语句除了作为传统的控制流,还可以用在对可选型的解包以及模式匹配中。while expression { statements }
-
-
2)
repeat-while
语句-
在 Swift 3.0 中 C 语言样式的
do-while
循环语句被废弃,使用repeat-while
循环语句代替。repeat { statements } while expression
-
3、控制转向语句
-
continue
:会通知一个循环体立即停止本次循环,直接回到循环条件判断,重新开始下次循环。 -
break
:会立即中断该循环体,然后跳转到表示循环体结束的大括号后的第一行代码,即跳出本层循环体。可以在switch
和循环结构中使用。 -
fallthrough
:在switch
语句中使代码继续执行到下一个case
中的代码,而不会检查它下一个将会落入执行的case
中的条件是否匹配,从而达到和 C 语言标准中switch
语句特性一样的效果。 -
标签语句
:Swift 语言提供了更强大的跳出机制,你可以显式的指出需要跳出的是哪一层循环或switch
结构。为了实现这个目的,我们可以使用标签来为循环体或者switch
代码打上标记,当需要使用break
或者continue
时,带上这个标签就可以控制跳出或中断的是哪一个循环或switch
结构。labelName: for number in sArray { statements } // 跳出 loopName 循环 break labelName