2019独角兽企业重金招聘Python工程师标准>>>

在 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-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)。起保护作用的表达式是这样构成的:关键字where后面跟着一个作为额外测试条件的表达式。因此,当且仅当控制表达式匹配一个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

转载于:https://my.oschina.net/sunqichao/blog/279660

swift 简单语句 控制流语句相关推荐

  1. Mysql 中Sql控制流语句_DCL语句/控制流语句

    一.(1)DCL(数据控制语言)主要是数据库管理员用来管理其他用户权限时使用的语句:可以授予的权限包括以下: 列权限:和表中的一个具体列相关.表权限:和一个具体数据表中的所有数据相关.数据库权限:和一 ...

  2. Swift教程之控制流

    控制流 Swift包含很多控制流语句:while循环.if.guard.switch和for-in循环. For-In循环 for-in循环用于迭代序列,如数组遍历.数字范围.字符串中的字符. 下面为 ...

  3. python while循环语句-python while循环控制流语句结构与用法

    python while循环语句和for语句都是python的主要循环结构.while语句是python中最通用的迭代结构,也是一个条件循环语句.while与if语句有哪些不同,标准语法结构及循环使用 ...

  4. Java™ 教程(控制流语句)

    控制流语句 源文件中的语句通常按照它们出现的顺序从上到下执行,但是,控制流语句通过使用决策.循环和分支来分解执行流程,使你的程序能够有条件地执行特定的代码块,本节描述Java编程语言支持的决策语句(i ...

  5. python中if控制语句_了解Python控制流语句——if语句

    控制流 截止到现在,在我们所看过的程序中,总是有一系列语句从上到下精确排列,并交由 Python 忠实地执行.如果你想改变这一工作流程,应该怎么做?就像这样的情况:你需要程序作出一些决定,并依据不同的 ...

  6. 程序员前辈归纳整理Python中的控制流语句的知识点(要记得收藏)

    这篇文章主要归纳整理了Python中的控制流语句的知识点,来自于IBM官方网站技术文档,需要的朋友可以参考下 程序流 Python 解释器在其最简单的级别,以类似的方式操作,即从程序的顶端开始,然后一 ...

  7. 软考 java程序设计,软考程序员考点Java语言程序设计之控制流语句分类

    下面希赛小编为大家整理的软考程序员考点Java语言程序设计之控制流语句分类,希望能帮助学友们.具体内容如下: 分类 它们由特定的语句定义符组成.C语言有九种控制语句.可分成以下三类: (1).条件判断 ...

  8. 一条简单的更新语句,MySQL是如何加锁的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Java_老男孩 来源:https://urlify.cn/ ...

  9. JSP控制流语句和运算符

    2019独角兽企业重金招聘Python工程师标准>>> 控制流语句 JSP提供对Java语言的全面支持.您可以在JSP程序中使用Java API甚至建立Java代码块,包括判断语句和 ...

最新文章

  1. python内置对象的实现_Python 内置对象的实现
  2. 【Ubuntu-Tensorflow】InvalidArgumentError GPU不能使用的问题
  3. asp 强制转换浮点数值_C/C++中浮点数的编码存储
  4. Fragment与Activity交互(使用接口)
  5. 简单英文题 26 The Nearest Number(python)
  6. vue 自定义指令(directive)实例
  7. Mac使用sdkmanager从官网下载新版android SDK
  8. destoon php文件,Destoon模板制作简明教程
  9. Java第四次作业,面向对象高级特性(继承和多态)
  10. docker ubuntu安装python_BAT架构师手把手教你如何使用Docker安装GPU版本caffe2
  11. HTML/CSS/js 日期等其他函数 相关收藏
  12. 千万别惹程序员,否则会在代码注释里,告诉这家公司有多坑
  13. Netty游戏服务器实战开发(11):Spring+mybatis 手写分库分表策略(续)
  14. A survey on semi-supervised learning
  15. 【数字设计】沐曦科技_笔试题目分享
  16. 为什么要用malloc申请空间
  17. 基于最新WEB技术的Web SCADA构建“智慧煤矿”平台
  18. 股票投资 - 股票的安全边际
  19. 有没有人可以帮我解析一下下面的json
  20. [转帖]Photoshop将照片制作成素描效果

热门文章

  1. Python学习之函数及流程控制
  2. MonolithFirst:单体应用优先策略
  3. ny42 一笔画问题
  4. vmware esxi的安装
  5. IIS7.5部署ASP.NET失败
  6. 项目开发经验谈:转型---如何成为一个Team Leader --度量
  7. C#操作XML总结1
  8. python语言及其应用下载_Python语言及其应用 中文pdf完整版[13MB]
  9. Linux命令之 —— grep \ls \ ll \ sed \ bg fg \ ipset \ wc \ ifconfig \ awk
  10. 过河卒(Noip2002)