★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/) ➤GitHub地址:https://github.com/strengthen/LeetCode ➤原文地址: ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。 ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创! ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
热烈欢迎,请直接点击!!!
进入博主App Store主页,下载使用各个作品!!!
注:博主将坚持每月上线一个新app!!!
在Swift中,有三种语句:简单语句,编译器控制语句和控制流语句。简单语句是最常见的,由表达式或声明组成。编译器控制语句允许程序更改编译器行为的各个方面,并包括条件编译块和行控制语句。
控制流语句用于控制程序中的执行流程。Swift中有几种类型的控制流语句,包括循环语句,分支语句和控制转移语句。循环语句允许重复执行代码块,分支语句允许仅在满足某些条件时执行某个代码块,并且控制传输语句提供了一种改变代码执行顺序的方法。此外,Swift提供了一个do 语句来介绍范围,捕获和处理错误,以及defer 在当前作用域退出之前运行清理操作的语句。
分号(;)可以选择出现在任何语句之后,如果它们出现在同一行上,则用于分隔多个语句。
1 GRAMMAR OF A STATEMENT
2
3 statement → expression ;opt
4
5 statement → declaration ;opt
6
7 statement → loop-statement ;opt
8
9 statement → branch-statement ;opt
10
11 statement → labeled-statement ;opt
12
13 statement → control-transfer-statement ;opt
14
15 statement → defer-statement ;opt
16
17 statement → do-statement ;opt
18
19 statement → compiler-control-statement
20
21 statements → statement statements opt
循环语句
循环语句允许重复执行代码块,具体取决于循环中指定的条件。Swift有三个循环语句:a for - in 语句,while 语句和repeat - while 语句。
循环语句中的控制流可以通过break 语句和语句进行更改,continue 并在下面的Break语句和Continue语句中讨论。
1 GRAMMAR OF A LOOP STATEMENT
2
3 loop-statement → for-in-statement
4
5 loop-statement → while-statement
6
7 loop-statement → repeat-while-statement
For-In声明
甲for - in 语句允许的代码块,以一次一个集合(或任何类型的)在一个符合每个项目来执行Sequence 协议。
一个for - in 语句具有以下形式:
1 for item in collection {
2 statements
3 }
makeIterator() 在集合表达式上调用该方法以获取迭代器类型的值,即符合IteratorProtocol 协议的类型。程序通过调用next() 迭代器上的方法开始执行循环。如果返回的值不是nil ,则将其分配给项模式,程序执行语句,然后在循环开始时继续执行。否则,程序不执行赋值或执行语句,并且完成执行for - in 语句。
1 GRAMMAR OF A FOR-IN STATEMENT
2
3 for-in-statement → for caseopt pattern in expression where-clause opt code-block
while 语句
一个while 语句允许,只要一个条件不再成立时需要重复执行的代码块。
一个while 语句具有以下形式:
1 while condition {
2 statements
3 }
一个while 语句的执行过程如下:
-
的条件进行评价。
如果true ,执行继续执行步骤2.如果false ,程序完成执行while 语句。
-
程序执行语句,执行返回步骤1。
因为在执行语句之前评估条件的值,所以语句中的语句可以执行零次或多次。while
条件的值必须是Bool 桥接的类型或类型Bool 。条件也可以是可选的绑定声明,如Optional Binding中所述。
1 GRAMMAR OF A WHILE STATEMENT
2
3 while-statement → while condition-list code-block
4
5 condition-list → condition | condition , condition-list
6
7 condition → expression | availability-condition | case-condition | optional-binding-condition
8
9 case-condition → case pattern initializer
10
11 optional-binding-condition → let pattern initializer | var pattern initializer
repeat - while 语句
repeat - while 语句允许要执行的代码块一次或多次,只要条件保持为真。
一个repeat - while 语句具有以下形式:
1 repeat {
2 statements
3 } while condition
一个repeat - while 语句的执行过程如下:
-
程序执行语句,并继续执行步骤2。
-
的条件进行评价。
如果true ,执行返回到步骤1.如果false ,程序完成执行repeat - while 语句。
因为值条件后评估语句的执行,报表中repeat - while 语句中至少执行一次。
条件的值必须是Bool 桥接的类型或类型Bool 。条件也可以是可选的绑定声明,如Optional Binding中所述。
1 GRAMMAR OF A REPEAT-WHILE STATEMENT
2
3 repeat-while-statement → repeat code-block while expression
分支语句
分支语句允许程序根据一个或多个条件的值执行代码的某些部分。branch语句中指定的条件值控制程序如何分支,从而控制执行的代码块。Swift有三个分支语句:if 语句,guard 语句和switch 语句。
if 语句或switch 语句中的控制流可以通过break 语句更改,并在下面的Break语句中讨论。
1 GRAMMAR OF A BRANCH STATEMENT
2
3 branch-statement → if-statement
4
5 branch-statement → guard-statement
6
7 branch-statement → switch-statement
If语句
if 语句用于基于一个或多个条件的计算执行代码。
声明有两种基本形式if 。在每种形式中,都需要打开和关闭支撑。
第一种形式允许代码仅在条件为真时执行并具有以下形式:
1 if condition {
2 statements
3 }
第二种形式的if 语句提供了一个额外的else子句(由else 关键字引入),用于在条件为真时执行代码的一部分,在相同条件为假时用于执行另一部分代码。当存在单个else子句时,if 语句具有以下形式:
1 if condition {
2 statements to execute if condition is true
3 } else {
4 statements to execute if condition is false
5 }
if 语句的else子句可以包含另一个if 语句来测试多个条件。if 以这种方式链接在一起的声明具有以下形式:
1 if condition 1 {
2 statements to execute if condition 1 is true
3 } else if condition 2 {
4 statements to execute if condition 2 is true
5 } else {
6 statements to execute if both conditions are false
7 }
if 语句中任何条件的值必须是类型Bool 或桥接到的类型Bool 。条件也可以是可选的绑定声明,如Optional Binding中所述。
1 GRAMMAR OF AN IF STATEMENT
2
3 if-statement → if condition-list code-block else-clause opt
4
5 else-clause → else code-block | else if-statement
guard 语句
guard 语句用于如果一个或多个条件没有满足转移程序控制出范围。
一个guard 语句具有以下形式:
1 guard condition else {
2 statements
3 }
guard 语句中任何条件的值必须是类型Bool 或桥接类型Bool 。条件也可以是可选的绑定声明,如Optional Binding中所述。
在guard 语句条件中为可选绑定声明赋值的任何常量或变量都可以用于guard语句的封闭范围的其余部分。
语句的else 子句guard 是必需的,并且必须Never 使用以下语句之一调用具有返回类型的函数或在guard语句的封闭范围之外传递程序控制:
return
break
continue
throw
控制转移语句中讨论的控制转移语句之下。有关Never 返回类型的函数的更多信息,请参见永不返回的函数。
1 GRAMMAR OF A GUARD STATEMENT
2
3 guard-statement → guard condition-list else code-block
switch 语句
switch 语句允许的代码中的某些块以根据控制表达式的值来执行。
一个switch 语句具有以下形式:
1 switch control expression {
2 case pattern 1:
3 statements
4 case pattern 2 where condition:
5 statements
6 case pattern 3 where condition,
7 pattern 4 where condition:
8 statements
9 default:
10 statements
11 }
评估语句的控制表达式,switch 然后与每种情况下指定的模式进行比较。如果找到匹配项,程序将执行该案例范围内列出的语句。每个案例的范围不能为空。因此,您必须在: 每个案例标签的冒号()后面至少包含一个语句。break 如果您不打算在匹配案例的正文中执行任何代码,请使用单个语句。
代码可以分支的表达式的值非常灵活。例如,除了标量类型的值(例如整数和字符)之外,您的代码还可以分支任何类型的值,包括浮点数,字符串,元组,自定义类的实例和选项。所述的值对照表达甚至可以匹配到一个枚举的情况下的值,并检查包含在值的指定范围。有关如何在使用这些不同类型的值的实例switch 说明,请参阅交换机的控制流。
一个switch 案例可以选择where 在每个模式之后包含一个子句。甲where子句是由所引入的where 关键字随后的表达式,用于提供一个附加条件的情况下的图案被认为是前匹配于控制表达。如果存在where 子句,则仅当控件表达式的值与案例的某个模式匹配且子句的表达式求值时,才会执行相关案例中的语句。例如,只有当控件表达式是包含两个具有相同值的元素的元组时,控件表达式才匹配下面示例中的情况,例如。where true (1, 1)
case let (x, y) where x == y:
如上例所示,case中的模式也可以使用let 关键字绑定常量(它们也可以使用var 关键字绑定变量)。然后可以在相应的where 子句中以及在案例范围内的其余代码中引用这些常量(或变量)。如果案例包含与控制表达式匹配的多个模式,则所有模式必须包含相同的常量或变量绑定,并且每个绑定变量或常量必须在所有案例的模式中具有相同的类型。
一个switch 语句也可以包含一个默认的情况下,通过引入的default 关键字。仅当没有其他情况与控制表达式匹配时,才会执行默认情况下的代码。一个switch 声明只能包含一个默认的情况下,必须出现在结束switch 发言。
虽然模式匹配操作的实际执行顺序,特别是案例中模式的评估顺序未指定,但switch 语句中的模式匹配表现得好像评估是按源顺序执行的 - 即它们出现的顺序在源代码中。因此,如果多个案例包含评估为相同值的模式,因此可以匹配控制表达式的值,则程序仅按源顺序执行第一个匹配案例中的代码。
switch语句必须是详尽的
在Swift中,控件表达式类型的每个可能值必须与案例的至少一个模式的值匹配。如果这根本不可行(例如,当控制表达式的类型为Int )时,您可以包含一个默认大小写以满足要求。
执行不会隐瞒案件
在匹配的案例中的代码完成执行后,程序退出该switch 语句。程序执行不会继续或“落到”下一个案例或默认情况。也就是说,如果您希望执行从一个案例继续到下一个案例,请明确包含一个fallthrough 语句,该语句只包含fallthrough 关键字,在您希望继续执行的情况下。有关该fallthrough 语句的更多信息,请参阅下面的Fallthrough Statement。
1 GRAMMAR OF A SWITCH STATEMENT
2
3 switch-statement → switch expression { switch-cases opt }
4
5 switch-cases → switch-case switch-cases opt
6
7 switch-case → case-label statements
8
9 switch-case → default-label statements
10
11 switch-case → conditional-switch-case
12
13 case-label → case case-item-list :
14
15 case-item-list → pattern where-clause opt | pattern where-clause opt , case-item-list
16
17 default-label → default :
18
19 where-clause → where where-expression
20
21 where-expression → expression
22
23 conditional-switch-case → switch-if-directive-clause switch-elseif-directive-clauses opt switch-else-directive-clause opt endif-directive
24
25 switch-if-directive-clause → if-directive compilation-condition switch-cases opt
26
27 switch-elseif-directive-clauses → elseif-directive-clause switch-elseif-directive-clauses opt
28
29 switch-elseif-directive-clause → elseif-directive compilation-condition switch-cases opt
30
31 switch-else-directive-clause → else-directive switch-cases opt
标签语句
您可以为循环语句,if 语句,switch 语句或do 带有语句标签的语句添加前缀,该语句标签由标签名称后面跟冒号(:)组成。使用带有break 和continue 语句的语句标签可以明确地说明如何在循环语句或switch 语句中更改控制流,如下面的Break Statement和Continue Statement中所述。
标签语句的范围是语句标签后面的整个语句。您可以嵌套带标签的语句,但每个语句标签的名称必须是唯一的。
欲了解更多信息,看看如何使用语句标签示例,请参阅标签的语句中的控制流。
1 GRAMMAR OF A LABELED STATEMENT
2
3 labeled-statement → statement-label loop-statement
4
5 labeled-statement → statement-label if-statement
6
7 labeled-statement → statement-label switch-statement
8
9 labeled-statement → statement-label do-statement
10
11 statement-label → label-name :
12
13 label-name → identifier
控制转移声明
控制转移语句可以通过无条件地将程序控制从一段代码转移到另一段代码来改变程序中代码的执行顺序。Swift有五个控制转移语句:break 语句,continue 语句,fallthrough 语句,return 语句和throw 语句。
1 GRAMMAR OF A CONTROL TRANSFER STATEMENT
2
3 control-transfer-statement → break-statement
4
5 control-transfer-statement → continue-statement
6
7 control-transfer-statement → fallthrough-statement
8
9 control-transfer-statement → return-statement
10
11 control-transfer-statement → throw-statement
break语句
break 语句结束一个循环,一个程序执行if 的语句,或一个switch 语句。一个break 语句可以只由的break 关键字,也可以由该的break 关键字后面声明标签的名称,如下图所示。
1 break
2 break label name
当break 语句后跟语句标签的名称时,它将结束由该标签命名的循环,if 语句或switch 语句的程序执行。
如果break 语句后面没有语句标签的名称,它将结束switch 语句的程序执行或发生它的最内层的封闭循环语句。您不能使用未标记的break 语句来突破if 语句。
在这两种情况下,程序控制然后转移到封闭循环或switch 语句之后的第一行代码(如果有的话)。
有关如何使用的例子break 声明,请参阅断裂和标签的语句中的控制流。
1 GRAMMAR OF A BREAK STATEMENT
2
3 break-statement → break label-name opt
continue 语句
一个continue 语句结束循环语句的当前迭代的程序执行,但不停止循环语句的执行。一个continue 语句可以只由的continue 关键字,也可以由该的continue 关键字后面声明标签的名称,如下图所示。
1 continue
2 continue label name
当continue 语句后跟语句标签的名称时,它将结束由该标签命名的循环语句的当前迭代的程序执行。
当continue 语句后面没有语句标签的名称时,它结束程序执行它发生的最里面的封闭循环语句的当前迭代。
在这两种情况下,程序控制然后被转移到封闭循环语句的条件。
在for 语句中,在continue 执行语句之后仍然会计算递增表达式,因为在执行循环体之后会计算递增表达式。
有关如何使用的例子continue 声明,请参阅继续和标签的语句中的控制流。
1 GRAMMAR OF A CONTINUE STATEMENT
2
3 continue-statement → continue label-name opt
fallthrough 语句
fallthrough 语句由的fallthrough 关键字和只发生在一个的情况下的块switch 语句。一个fallthrough 语句导致程序从一个情况下,继续在switch 陈述了下情况。即使案例标签的模式与switch 语句的控制表达式的值不匹配,程序也会继续执行下一种情况。
一个fallthrough 语句可以在里面任何地方出现switch 的语句,而不是仅仅作为一个案例块的最后声明,但它不能在最后一种情况块中使用。它也不能将控制转移到其模式包含值绑定模式的大小写块中。
有关如何使用的例子fallthrough 在一份声明中switch 声明,请参阅控制转移语句中的控制流。
1 GRAMMAR OF A FALLTHROUGH STATEMENT
2
3 fallthrough-statement → fallthrough
return 语句
return 语句发生在函数或方法的定义和原因程序执行的主体返回到调用函数或方法。程序执行在函数或方法调用之后的紧接点继续。
甲return 语句可以仅由的return 关键字,或者它可以由所述的return 关键字后跟表达式,如下所示。
1 return
2 return expression
当return 语句后跟表达式时,表达式的值将返回给调用函数或方法。如果表达式的值与函数或方法声明中声明的返回类型的值不匹配,则表达式的值在返回到调用函数或方法之前将转换为返回类型。
注意
如Failable Initializers中所述,可以在可用的初始化程序中使用特殊形式的return statement()来指示初始化失败。return nil
当return 语句后面没有表达式时,它只能用于从不返回值的函数或方法返回(也就是说,当函数或方法的返回类型为Void 或时() )。
1 GRAMMAR OF A RETURN STATEMENT
2
3 return-statement → return expression opt
Throw语句
throw 语句发生在一个投掷函数或方法的主体中,或在一闭合表达式,其类型被标与主体throws 关键字。
甲throw 语句导致程序来结束当前范围执行和开始错误传播到其封闭的范围。抛出的错误继续传播,直到它由语句的catch 子句处理do 。
甲throw 语句由的throw 关键字后跟一个表达式,如下所示。
表达式的值必须具有符合Error 协议的类型。
有关如何使用throw 语句的示例,请参阅在错误处理中使用投掷函数传播错误。
1 GRAMMAR OF A THROW STATEMENT
2
3 throw-statement → throw expression
defer 语句
defer 语句用于只是传送该范围之外的控制程序之前,执行代码defer 语句出现的地方
一个defer 语句具有以下形式:
1 defer {
2 statements
3 }
defer 无论程序控制如何转移,都会执行语句中的语句。这意味着defer 可以使用语句来执行手动资源管理,例如关闭文件描述符,以及执行即使抛出错误也需要执行的操作。
如果多个defer 语句出现在同一范围内,则它们出现的顺序与执行顺序相反。首先执行defer 给定范围中的最后一个语句意味着该最后一个defer 语句中的语句可以引用将被其他defer 语句清除的资源。
1 func f() {
2 defer { print("First defer") }
3 defer { print("Second defer") }
4 print("End of function")
5 }
6 f()
7 // Prints "End of function"
8 // Prints "Second defer"
9 // Prints "First defer"
声明中的defer 语句不能在语句之外传递程序控制defer 。
1 GRAMMAR OF A DEFER STATEMENT
2
3 defer-statement → defer code-block
do 语句
do 语句用于引入新范围,并且可以选择包含一个或多个catch 子句,这些子句包含与定义的错误条件匹配的模式。在do 语句范围内声明的变量和常量只能在该范围内访问。
do Swift中的语句类似于{} C中用于分隔代码块的花括号(),并且在运行时不会产生性能成本。
一个do 语句具有以下形式:
1 do {
2 try expression
3 statements
4 } catch pattern 1 {
5 statements
6 } catch pattern 2 where condition {
7 statements
8 }
与switch 语句一样,编译器会尝试推断catch 子句是否详尽无遗。如果可以做出这样的确定,则认为错误被处理。否则,错误可能会传播到包含范围之外,这意味着错误必须由封闭catch 子句处理,或者必须声明包含函数throws 。
要确保处理错误,请使用catch 带有匹配所有错误的模式的子句,例如通配符模式(_ )。如果catch 子句未指定模式,则catch 子句匹配并将任何错误绑定到名为的本地常量error 。有关可在catch 子句中使用的模式的更多信息,请参阅模式。
要查看如何使用do 带有多个catch 子句的 |
请发表评论