在 Swift 中。有两种类型的语句:简单语句和控制流语句。简单语句是最常见的。用于构造表达式和声明。控制流语句则用于控制程序运行的流程,Swift 中有三种类型的控制流语句:循环语句、分支语句和控制传递语句。
循环语句用于反复运行代码块。分支语句用于运行满足特定条件的代码块;控制传递语句则用于改动代码的运行顺序。在稍后的叙述中,将会具体地介绍每一种类型的控制流语句。
是否将分号(;)加入到语句的结尾处是可选的。但若要在同一行内写多条独立语句,请务必使用分号。
GRAMMAR OF A STATEMENT
statement → expression; opt
statement → declaration; opt
statement → loop-statement; opt
statement → branch-statement; opt
statement → labeled-statement
statement → control-transfer-statement; opt
statement → statment statements; opt
循环语句
取决于特定的循环条件,循环语句同意反复运行代码块。Swift 提供四种类型的循环语句:for语句、for-in语句、while语句和do-while语句。
通过break语句和continue语句能够改变循环语句的控制流。有关这两条语句。详情參见 Break 语句和 Continue 语句。
GRAMMAR OF A LOOP STATEMENT
loop-statement → for-statement
loop-statement → for-in-statement
loop-statement → while-statement
loop-statement → do-while-statement
For 语句
for语句同意在反复运行代码块的同一时候,递增一个计数器。
for语句的形式例如以下:
- for `initialzation`; `condition`; `increment` {
- `statements`
- }
initialzation、condition 和 increment 之间的分号,以及包围循环体 statements 的大括号都是不可省略的。
for语句的运行流程例如以下:
1、initialzation 仅仅会被运行一次,通经常使用于声明和初始化在接下来的循环中须要使用的变量。
2、计算 condition 表达式: 假设为true。statements 将会被运行,然后转到第3步。假设为false,statements 和 increment 都不会被运行。for至此运行完成。
3、计算 increment 表达式。然后转到第2步。
定义在 initialzation 中的变量仅在for语句的作用域以内有效。condition 表达式的值的类型必须遵循LogicValue协议。
GRAMMAR OF A FOR STATEMENT
for-statement → for for-init opt ; expression opt ; expression opt code-block
for-statement → for ( for-init opt ; expression opt ; expression opt ) code-block
for-statement → variable-declaration | expression-list
For-In 语句
for-in语句同意在反复运行代码块的同一时候。迭代集合(或遵循Sequence协议的随意类型)中的每一项。
for-in语句的形式例如以下:
- for `item` in `collection` {
- `statements`
- }
for-in语句在循环開始前会调用 collection 表达式的generate方法来获取一个生成器类型(这是一个遵循Generator协议的类型)的值。接下来循环開始。调用 collection 表达式的next方法。
假设其返回值不是None。它将会被赋给 item,然后运行 statements,运行完成后回到循环開始处;否则,将不会赋值给 item 也不会运行 statements。for-in至此运行完成。
GRAMMAR OF A FOR-IN STATEMENT
for-in-statement → for pattern in expression code-block
While 语句
while语句同意反复运行代码块。
while语句的形式例如以下:
- while `condition` {
- `statements`
- }
while语句的运行流程例如以下:
1、计算 condition 表达式: 假设为真true,转到第2步。
假设为false。while至此运行完成。
2、运行 statements 。然后转到第1步。
因为 condition 的值在 statements 运行前就已计算出。因此while语句中的 statements 可能会被运行若干次,也可能不会被运行。
condition 表达式的值的类型必须遵循LogicValue协议。同一时候,condition 表达式也能够使用可选绑定,详情參见可选绑定。
GRAMMAR OF A WHILE STATEMENT
while-statement → while while-condition code-block
while-condition → expression | declaration
Do-While 语句
do-while语句的形式例如以下:
- do {
- `statements`
- } while `condition`
do-while语句的运行流程例如以下:
1、运行 statements。然后转到第2步。
2、计算 condition 表达式: 假设为true,转到第1步。假设为false,do-while至此运行完成。
因为 condition 表达式的值是在 statements 运行后才计算出,因此do-while语句中的 statements 至少会被运行一次。
condition 表达式的值的类型必须遵循LogicValue协议。同一时候,condition 表达式也能够使用可选绑定,详情參见可选绑定。
GRAMMAR OF A DO-WHILE STATEMENT
do-while-statement → do code-block while while-condition
分支语句
取决于一个或者多个条件的值。分支语句同意程序运行指定部分的代码。
显然。分支语句中条件的值将会决定怎样分支以及运行哪一块代码。Swift 提供两种类型的分支语句:if语句和switch语句。
switch语句中的控制流能够用break语句改动,详情请见Break 语句。
GRAMMAR OF A BRANCH STATEMENT
branch-statement → if-statement
branch-statement → switch-statement
If 语句
取决于一个或多个条件的值。if语句将决定运行哪一块代码。
if语句有两种标准形式,在这两种形式里都必须有大括号。
第一种形式是当且仅当条件为真时运行代码。像以下这样:
- if `condition` {
- `statements`
- }
另外一种形式是在第一种形式的基础上加入 else 语句,当仅仅有一个 else 语句时,像以下这样:
- if `condition` {
- `statements to execute if condition is true`
- } else {
- `statements to execute if condition is false`
- }
同一时候,else 语句也可包括if语句。从而形成一条链来測试很多其它的条件。像以下这样:
- if `condition 1` {
- `statements to execute if condition 1 is true`
- } else if `condition 2` {
- `statements to execute if condition 2 is true`
- }
- else {
- `statements to execute if both conditions are false`
- }
if语句中条件的值的类型必须遵循LogicValue协议。同一时候,条件也能够使用可选绑定。详情參见可选绑定。
GRAMMAR OF AN IF STATEMENT
if-statement → if if-condition code-block else-clause opt
if-condition → expression | declaration
else-clause → else code-block | else if-statement opt
Switch 语句
取决于switch语句的控制表达式(control expression),switch语句将决定运行哪一块代码。
switch语句的形式例如以下:
- switch `control expression` {
- case `pattern 1`:
- `statements`
- case `pattern 2` where `condition`:
- `statements`
- case `pattern 3` where `condition`,
- `pattern 4` where `condition`:
- `statements`
- default:
- `statements`
- }
switch语句的控制表达式(control expression)会首先被计算。然后与每个 case 的模式(pattern)进行匹配。假设匹配成功,程序将会运行相应的 case 分支里的 statements。另外,每个 case 分支都不能为空。也就是说在每个 case 分支中至少有一条语句。假设你不想在匹配到的 case 分支中运行代码。仅仅需在该分支里写一条break语句就可以。
能够用作控制表达式的值是十分灵活的,除了标量类型(scalar types。如Int、Character)外,你能够使用不论什么类型的值,包含浮点数、字符串、元组、自己定义类的实例和可选(optional)类型,甚至是枚举类型中的成员值和指定的范围(range)等。
关于在switch语句中使用这些类型,详情參见控制流一章的 Switch。
你能够在模式后面加入一个起保护作用的表达式(guard expression)。起保护作用的表达式是这样构成的:keywordwhere后面跟着一个作为额外測试条件的表达式。因此,当且仅当控制表达式匹配一个case的某个模式且起保护作用的表达式为真时,相应 case 分支中的 statements 才会被运行。在以下的样例中,控制表达式仅仅会匹配含两个相等元素的元组。如(1, 1):
- case let (x, y) where x == y:
正如上面这个样例。也能够在模式中使用let(或var)语句来绑定常量(或变量)。这些常量(或变量)能够在其相应的起保护作用的表达式和其相应的case块里的代码中引用。
可是,假设 case 中有多个模式匹配控制表达式,那么这些模式都不能绑定常量(或变量)。
switch语句也能够包括默认(default)分支。仅仅有其他 case 分支都无法匹配控制表达式时。默认分支中的代码才会被运行。一个switch语句仅仅能有一个默认分支。并且必须在switch语句的最后面。
虽然模式匹配操作实际的运行顺序。特别是模式的计算顺序是不可知的,可是 Swift 规定switch语句中的模式匹配的顺序和书写源码的顺序保持一致。因此。当多个模式含有同样的值且可以匹配控制表达式时,程序仅仅会运行源码中第一个匹配的 case 分支中的代码。
Switch 语句必须是完备的
在 Swift 中。switch语句中控制表达式的每个可能的值都必须至少有一个 case 分支与之相应。在某些情况下(比如,表达式的类型是Int),你能够使用默认块满足该要求。
不存在隐式的贯穿(fall through)
当匹配的 case 分支中的代码运行完成后。程序会终止switch语句。而不会继续运行下一个 case 分支。这就意味着。假设你想运行下一个 case 分支,须要显式地在你须要的 case 分支里使用fallthrough语句。
关于fallthrough语句的很多其它信息。详情參见 Fallthrough 语句。
GRAMMAR OF A SWITCH STATEMENT
switch-statement → switch expression { switch-cases opt }
switch-cases → switch-case switch-cases opt
switch-case → case-label statement | default-label statements
switch-case → case-label ; | default-label ;
case-label → case case-item-list :
case-item-list → pattern guard-clause opt | pattern guard-clause opt, case-item-list
default-label → default :
guard-clause → where guard-expression
guard-expression → expression
带标签的语句
你能够在循环语句或switch语句前面加上标签。它由标签名和紧随其后的冒号(:)组成。在break和continue后面跟上标签名能够显式地在循环语句或switch语句中更改控制流,把控制权传递给指定标签标记的语句。关于这两条语句使用方法。详情參见 Break 语句和 Continue 语句。
标签的作用域是该标签所标记的语句之后的全部语句。你能够不使用带标签的语句,但仅仅要使用它,标签名就必唯一。
关于使用带标签的语句的样例,详情參见控制流一章的带标签的语句。
GRAMMAR OF A LABELED STATEMENT
labeled-statement → statement-label loop-statement | statement-label switch-statement
statement-label → label-name :
label-name → identifier
控制传递语句
通过无条件地把控制权从一片代码传递到还有一片代码,控制传递语句可以改变代码运行的顺序。Swift 提供四种类型的控制传递语句:break语句、continue语句、fallthrough语句和return语句。
GRAMMAR OF A CONTROL TRANSER STATEMENT
control-transfer-statement → break-statement
control-transfer-statement → continue-statement
control-transfer-statement → fallthrough-statement
control-transfer-statement → return-statement
Break 语句
break语句用于终止循环或switch语句的运行。使用break语句时,能够仅仅写break这个关键词。也能够在break后面跟上标签名(label name),像以下这样:
- break
- break `label name`
当break语句后面带标签名时,可用于终止由这个标签标记的循环或switch语句的运行。
而当仅仅写break时。则会终止switch语句或上下文中包括break语句的最内层循环的运行。
在这两种情况下,控制权都会被传递给循环或switch语句外面的第一行语句。
关于使用break语句的样例,详情參见控制流一章的 Break 和带标签的语句。
GRAMMAR OF A BREAK STATEMENT
break-statement → break label-name opt
Continue 语句
continue语句用于终止循环中当前迭代的运行,但不会终止该循环的运行。使用continue语句时,能够仅仅写continue这个关键词,也能够在continue后面跟上标签名(label name)。像以下这样:
- continue
- continue `label name`
当continue语句后面带标签名时。可用于终止由这个标签标记的循环中当前迭代的运行。
而当仅仅写break时,可用于终止上下文中包括continue语句的最内层循环中当前迭代的运行。
在这两种情况下,控制权都会被传递给循环外面的第一行语句。
在for语句中,continue语句运行后。increment 表达式还是会被计算。这是由于每次循环体运行完成后 increment 表达式都会被计算。
关于使用continue语句的样例,详情參见控制流一章的 Continue 和带标签的语句。
GRAMMAR OF A CONTINUE STATEMENT
continue-statement → continue label-name opt
Fallthrough 语句
fallthrough语句用于在switch语句中传递控制权。fallthrough语句会把控制权从switch语句中的一个 case 传递给下一个 case 。这样的传递是无条件的。即使下一个 case 的模式与switch语句的控制表达式的值不匹配。
fallthrough语句可出如今switch语句中的随意 case 里,但不能出如今最后一个 case 分支中。
同一时候,fallthrough语句也不能把控制权传递给使用了可选绑定的 case 分支。
关于在switch语句中使用fallthrough语句的样例。详情參见控制流一章的控制传递语句。
GRAMMAR OF A FALLTHROUGH STATEMENT
continue-statement → fallthrough
Return 语句
return语句用于在函数或方法的实现中将控制权传递给调用者,接着程序将会从调用者的位置继续向下运行。
使用return语句时,能够仅仅写return这个关键词,也能够在return后面跟上表达式,像以下这样:
- return
- return `expression`
当return语句后面带表达式时,表达式的值将会返回给调用者。假设表达式值的类型与调用者期望的类型不匹配,Swift 则会在返回表达式的值之前将表达式值的类型转换为调用者期望的类型。
而当只写return时。不过将控制权从该函数或方法传递给调用者,而不返回一个值。(这就是说,该函数或方法的返回类型为Void或())
GRAMMAR OF A RETURN STATEMENT
return-statement → return expression opt