iOS开发——swift篇&经典语法(三)语句

语句

在 Swift 中,有两种类型的语句:简单语句和控制流语句。简单语句是最常见的,用于构造表达式和声明。控制流语句则用于控制程序执行的流程,Swift 中有三种类型的控制流语句:循环语句、分支语句和控制传递语句。

循环语句用于重复执行代码块;分支语句用于执行满足特定条件的代码块;控制传递语句则用于修改代码的执行顺序。在稍后的叙述中,将会详细地介绍每一种类型的控制流语句。

是否将分号(;)添加到语句的结尾处是可选的。但若要在同一行内写多条独立语句,请务必使用分号。

  1. GRAMMAR OF A STATEMENT
  2. statement → expression; opt
  3. statement → declaration; opt
  4. statement → loop-statement; opt
  5. statement → branch-statement; opt
  6. statement → labeled-statement
  7. statement → control-transfer-statement; opt
  8. statement → statment statements; opt

循环语句
取决于特定的循环条件,循环语句允许重复执行代码块。Swift 提供四种类型的循环语句:for语句、for-in语句、while语句和do-while语句。

通过break语句和continue语句可以改变循环语句的控制流。有关这两条语句,详情参见 Break 语句和 Continue 语句。

  1. GRAMMAR OF A LOOP STATEMENT
  2. loop-statement → for-statement
  3. loop-statement → for-in-statement
  4. loop-statement → while-statement
  5. loop-statement → do-while-statement

For 语句

  • for语句允许在重复执行代码块的同时,递增一个计数器。
  • for语句的形式如下:
  • for initialzation; condition; increment {
  • statements
  • }
  • initialzation、condition 和 increment 之间的分号,以及包围循环体 statements 的大括号都是不可省略的。
  • for语句的执行流程如下:
  • initialzation 只会被执行一次,通常用于声明和初始化在接下来的循环中需要使用的变量。

    • 计算 condition 表达式: 如果为true,statements 将会被执行,然后转到第3步。如果为false,statements 和 increment 都不会被执行,for至此执行完毕。

      • 计算 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语句的执行流程如下:
  • 计算 condition 表达式: 如果为真true,转到第2步。如果为false,while至此执行完毕。
  • 执行 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语句的执行流程如下:
  • 执行 statements,然后转到第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 语句。

  1. GRAMMAR OF A BRANCH STATEMENT
  2. branch-statement → if-statement
  3. 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语句。

  1. GRAMMAR OF A CONTROL TRANSER STATEMENT
  2. control-transfer-statement → break-statement
  3. control-transfer-statement → continue-statement
  4. control-transfer-statement → fallthrough-statement
  5. 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
时间: 2024-07-29 22:13:37

iOS开发——swift篇&经典语法(三)语句的相关文章

iOS开发——swift篇&经典语法(二十七)Swift与Objective-C简单对比

Swift与Objective-C的对比 系列(一) WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言Swift 雨燕, 这个消息会前没有半点风声的走漏.消息发布当时,会场一片惊呼,相信全球看直播的码农们当时也感觉脑袋被敲了一记闷棍吧.于是熬夜学习了Swift大法,越看越想高呼 ” Swift大法好!“ 程序员,最讲究的就是实事求是和客观,下面就开始对比两种语言. 首先要强调的是,Swift绝对不是解释性语言,更不是脚本语言,它和Objective-C,C++一样,编译器最终会把它翻译成

iOS开发——swift篇&经典语法(十九)协议

协议 Protocol(协议)用于统一方法和属性的名称,而不实现任何功能.协议能够被类,枚举,结构体实现,满足协议要求的类,枚举,结构体被称为协议的遵循者. 遵循者需要提供协议指定的成员,如属性,方法,操作符,下标等. 协议的语法 协议的定义与类,结构体,枚举的定义非常相似,如下所示: protocol SomeProtocol { // 协议内容 } 在类,结构体,枚举的名称后加上协议名称,中间以冒号:分隔即可实现协议:实现多个协议时,各协议之间用逗号,分隔,如下所示: struct Some

iOS开发——swift篇&经典语法(二十一)泛型

泛型 泛型代码可以让你写出根据自我需求定义.适用于任何类型的,灵活且可重用的函数和类型.它的可以让你避免重复的代码,用一种清晰和抽象的方式来表达代码的意图. 泛型是 Swift 强大特征中的其中一个,许多 Swift 标准库是通过泛型代码构建出来的.事实上,泛型的使用贯穿了整本语言手册,只是你没有发现而已.例如,Swift 的数组和字典类型都是泛型集.你可以创建一个Int数组,也可创建一个String数组,或者甚至于可以是任何其他 Swift 的类型数据数组.同样的,你也可以创建存储任何指定类型

iOS开发——swift篇&经典语法(十三)复合类型

集合类型 Swift 提供两种集合类型来存储集合,数组和字典.数组是一个同类型的序列化列表集合.字典是一个能够使用类似于键的唯一标识符来获取值的非序列化集合. 在Swift中,数组和字典的键和值都必须明确它的类型.这意味这数组和字典不会插入一个错误的类型的值,以致于出错.这也意味着当你在数组和字典中取回数值的时候能够确定它的类型. Swift 使用确定的集合类型可以保证代码工作是不会出错,和让你在开发阶段就能更早的捕获错误. note: Swift的数组 储存不同的类型会展示出不同的行为,例如变

iOS开发——swift篇&经典语法(十六)枚举类型

枚举类型 枚举定义了一个常用的具有相关性的一组数据,并在你的代码中以一个安全的方式使用它们. 如果你熟悉C语言,你就会知道,C语言中的枚举指定相关名称为一组整数值.在Swift中枚举更为灵活,不必为枚举的每个成员提供一个值.如果一个值(被称为“原始”的值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或者任何整数或浮点类型的值. 另外,枚举成员可以指定任何类型,每个成员都可以存储的不同的相关值,就像其他语言中使用集合或变体.你还可以定义一组通用的相关成员为一个枚举,每一种都有不同的一组

iOS开发——swift篇&经典语法(十)属性

属性 属性是描述特定类.结构或者枚举的值.存储属性作为实例的一部分存储常量与变量的值,而计算属性计算他们的值(不只是存储).计算属性存在于类.结构与枚举中.存储属性仅仅只在类与结构中. 属性通常与特定类型实例联系在一起.但属性也可以与类型本身联系在一起,这样的属性称之为类型属性. 另外,可以定义属性观察者来处理属性值发生改变的情况,这样你就可以对用户操作做出反应.属性观察者可以被加在自己定义的存储属性之上,也可以在从父类继承的子类属性之上. 1.存储属性 最简单的情形,作为特定类或结构实例的一部

iOS开发——swift篇&经典语法(八)初始化

初始化 初始化是类,结构体和枚举类型实例化的准备阶段.这个阶段设置这个实例存储的属性的初始化数值和做一些使用实例之前的准备以及必须要做的其他一些设置工作. 通过定义构造器(initializers)实现这个实例化过程,也就是创建一个新的具体实例的特殊方法.和Objective-C不一样的是,Swift的构造器没有返回值.它们主要充当的角色是确保这个实例在使用之前能正确的初始化. 类实例也能实现一个析构器(deinitializer),在类实例销毁之前做一些清理工作.更多的关于析构器(deinit

iOS开发——swift篇&经典语法(十八)拓展

扩展 扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模).扩展和 Objective-C 中的分类(categories)类似.(不过与Objective-C不同的是,Swift 的扩展没有名字.) Swift 中的扩展可以: 添加计算型属性和计算静态属性 定义实例方法和类型方法 提供新的构造器 定义下标 定义和使用新的嵌套类型 使一个已有类型符合某个接口 注意: 如果你定义了一个扩展向一个已有类型

iOS开发——swift篇&经典语法(二十)高级运算符

高级运算符 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的.溢出行为会被捕获并报告为错误.你是故意的?好吧,你可以使用Swift为你准备的另一套默认允许溢出的数值运算符,如可溢出加&+.所有允许溢出的运算符都是以&开始的. 自定义的结构,类和枚举,是否可以使用标准的运算符来定义操作?当然可以!在Swift中,你可以为你创建的所有类型定制运算符的操作.