• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift5.3语言参考(五)语句

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(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 forin语句,while语句和repeatwhile语句。

循环语句中的控制流可以通过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声明

forin语句允许的代码块,以一次一个集合(或任何类型的)在一个符合每个项目来执行Sequence协议。

一个forin语句具有以下形式:

1 for item in collection {
2     statements
3 }

makeIterator()集合表达式上调用方法以获取迭代器类型的值,即符合IteratorProtocol协议的类型程序通过调用next()迭代器上的方法开始执行循环如果返回的值不是nil,则将其分配给模式,程序执行语句,然后在循环开始时继续执行。否则,程序不执行赋值或执行语句,并且完成执行forin语句。

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语句的执行过程如下:

  1. 条件进行评价。

    如果true,执行继续执行步骤2.如果false,程序完成执行while语句。

  2. 程序执行语句,执行返回步骤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

repeatwhile语句

repeatwhile语句允许要执行的代码块一次或多次,只要条件保持为真。

一个repeatwhile语句具有以下形式:

1 repeat {
2     statements
3 } while condition

一个repeatwhile语句的执行过程如下:

  1. 程序执行语句,并继续执行步骤2。

  2. 条件进行评价。

    如果true,执行返回到步骤1.如果false,程序完成执行repeatwhile语句。

因为值条件后评估语句的执行,报表repeatwhile语句中至少执行一次。

条件的值必须是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子句,则仅当控件表达式的值与案例的某个模式匹配且子句的表达式值时,才会执行相关案例中语句例如,只有当控件表达式是包含两个具有相同值的元素的元组时,控件表达式才匹配下面示例中的情况,例如wheretrue(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-casecase-label statements
 8 
 9 switch-casedefault-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-caseswitch-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带有语句标签语句添加前缀,该语句标签由标签名称后面跟冒号(:)组成。使用带有breakcontinue语句的语句标签可以明确地说明如何在循环语句或switch语句中更改控制流,如下面的Break StatementContinue 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中所述,可以在可用的初始化程序中使用特殊形式的returnstatement()来指示初始化失败。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关键字后跟一个表达式,如下所示。

throw expression

表达式的值必须具有符合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语句范围内声明的变量和常量只能在该范围内访问。

doSwift中语句类似于{}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子句


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[Swift]LeetCode214.最短回文串|ShortestPalindrome发布时间:2022-07-13
下一篇:
Swift图形和绘画发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap