第七章.控制转移语句

控制转移语句

控制转移语句改变你代码的执行顺序,通过它你可以实现代码的跳转。Swift有四种控制转移语句。 

  • continue
  • break
  • fallthrough
  • return

我们将会在下面讨论continue ,break,和fallthrough语句。return语句将会在函数章节讨论。

Continue

continue告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。就好像在说“本次循环迭代我已经执行完了”,但是并不会离开整个循环体。

注意:在一个for-condition-increment循环体中,在调用continue语句后,迭代增量仍然会被计算求值。循环体继续像往常一样工作,仅仅只是循环体中的执行代码会被跳过。

下面的例子把一个小写字符串中的元音字母和空格字符移除,生成了一个含义模糊的短句:

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput {
  switch character {
  case "a", "e", "i", "o", "u", " ":
    continue
  default:
    puzzleOutput += character
  }
}
println(puzzleOutput)
// prints "grtmndsthnklk"

在上面的代码中,只要匹配到元音字母或者空格字符,就调用continue语句,使本次循环迭代结束,从新开始下次循环迭代。这种行为使switch匹配到元音字母和空格字符时不做处理,而不是让每一个匹配到的字符都被打印。

Break

break语句会立刻结束整个控制流的执行。当你想要更早的结束一个switch代码块或者一个循环体时,你都可以使用break语句。

在循环体中使用Break

当在一个循环体中使用break时,会立刻中断该循环体的执行,然后跳转到表示循环体结束的大括号(})后的第一行代码。不会再有本次循环迭代的代码被执行,也不会再有下次的循环迭代产生。

在Switch代码块中使用Break

当在一个switch代码块中使用break时,会立即中断该switch代码块的执行,并且跳转到表示switch代码块结束的大括号(})后的第一行代码。

这种特性可以被用来匹配或者忽略一个或多个分支。因为Swift语言的switch需要包含所有的分支而且不允许有为空的分支,有时为了使你的意图更明显,需要特意匹配或者忽略某个分支。那么当你想忽略某个分支时,可以在该分支内写上break语句。当那个分支被匹配到时,分支内的break语句立即结束switch代码块。

注意:当一个switch分支仅仅包含注释时,会被报编译时错误。注释不是代码语句而且也不能让switch分支达到被忽略的效果。你总是可以使用break来忽略某个分支。

下面的例子通过switch来判断一个Character值是否代表下面四种语言之一。为了简洁,多个值被包含在了同一个分支情况中。

let numberSymbol: Character = "三" // Simplified Chinese for the number 3
possibleIntegerValue: Int?
switch numberSymbol {
case "1", "?", "一", "?":
  possibleIntegerValue = 1
case "2", "?", "二", "?":
  possibleIntegerValue = 2
case "3", "?", "三", "?":
  possibleIntegerValue = 3
case "4", "?", "四", "?":
  possibleIntegerValue = 4
default:
  break
}
if let integerValue = possibleIntegerValue {
  println("The integer value of \(numberSymbol) is \(integerValue).")
} else {
  println("An integer value could not be found for \(numberSymbol).")
}
// prints "The integer value of 三 is 3."

这个例子检查numberSymbol是否是拉丁,阿拉伯,中文或者泰语中的1...4之一。如果被匹配到,该switch分支语句给Int?类型变量possibleIntegerValue设置一个整数值。

当switch代码块执行完后,接下来的代码通过使用可选绑定来判断‘possibleIntegerValue‘是否曾经被设置过值。因为是可选类型的缘故,‘possibleIntegerValue‘有一个隐式的初始值nil,所以仅仅当possibleIntegerValue曾被switch代码块的前四个分支中的某个设置过一个值时,可选的绑定将会被判定为成功。

在上面的例子中,想要把Character所有的的可能性都枚举出来是不现实的,所以使用default分支来包含所有上面没有匹配到字符的情况。由于这个default分支不需要执行任何动作,所以它只写了一条break语句。一旦落入到default分支中后,break语句就完成了该分支的所有代码操作,代码继续向下,开始执行if let语句。

Fallthrough

Swift语言中的switch不会从上一个case分支落入到下一个case分支中。相反,只要第一个匹配到的case分支完成了它需要执行的语句,整个switch代码块完成了它的执行。相比之下,C语言要求你显示的插入break语句到每个switch分支的末尾来阻止自动落入到下一个case分支中。Swift语言的这种避免默认落入到下一个分支中的特性意味着它的switch 功能要比C语言的更加清晰和可预测,可以避免无意识地执行多个case分支从而引发的错误。

如果你确实需要C风格的落入(fallthrough)的特性,你可以在每个需要该特性的case分支中使用fallthrough关键字。下面的例子使用fallthrough来创建一个数字的描述语句。

let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
  description += " a prime number, and also"
  fallthrough
default:
  description += " an integer."
}
println(description)
// prints "The number 5 is a prime number, and also an integer."

注意:fallthrough关键字不会检查它下一个将会落入执行的case中的匹配条件。fallthrough简单地使代码执行继续连接到下一个case中的执行代码,这和C语言标准中的switch语句特性是一样的。

标签语句

在Swift语言中,你可以在循环体和switch代码块中嵌套循环体和switch代码块来创造复杂的控制流结构。然而,循环体和switch代码块两者都可以使用break语句来提前结束整个方法体。因此,显示地指明break语句想要终止的是哪个循环体或者switch代码块,会很有用。类似地,如果你有许多嵌套的循环体,显示指明continue语句想要影响哪一个循环体也会非常有用。

为了实现这个目的,你可以使用标签来标记一个循环体或者switch代码块,当使用break或者continue时,带上这个标签,可以控制该标签代表对象的中断或者执行。

产生一个带标签的语句是通过在该语句的关键词的同一行前面放置一个标签,并且该标签后面还需带着一个冒号。下面是一个while循环体的语法,同样的规则适用于所有的循环体和switch代码块。

label name: while condition {
    statements
}

下面的例子是在一个带有标签的while循环体中调用break和continue语句,该循环体是上述章节中蛇梯棋游戏的改编版本。这次,游戏增加了一条额外的规则:

- 为了获胜,你必须刚好落在方格25中。

如果某次掷骰子使你的移动超出方格25,你必须重新掷骰子,直到你掷出的骰子数刚好使你能落在方格25中。

游戏的棋盘和之前一样:

来源:http://www.cocoachina.com/ios/20140611/8769.html

2015-03-19

21:57:54

时间: 2024-10-10 00:33:03

第七章.控制转移语句的相关文章

第3章 控制循环语句

控制跳转语句break1.1.1 Break的使用场景和作用break的使用场景:在选择结构switch语句中在循环语句中离开使用场景的存在是没有意义的break的作用:跳出单层循环1.1.2 代码案例十八 package com.itheima_07;/* break:中断的意思 使用场景: A:switch语句中 B:循环中 注意: 离开使用场景是没有意义的. 作用: 跳出循环,让循环提前结束*/public class BreakDemo {public static void main(

《Java开发手册》学习进程之第4章控制流程语句

在多重选择:switch语句中,switch(a)中的a可以为基本类型表达式,也可以为枚举类型表达式.而case后面所跟的表达式也是要满足以下条件的: 与a的表达式相兼容 自身应为不能有变量(即只能有字面值或者final的变量) 不能有两个相同的case 另外,要注意switch语句的根本执行流程:switch将判断表达式的值与case后面的表达式的值进行匹配,若找到匹配的case,则从此case开始执行,若没有匹配到相应的case,而遇到了default,则从default开始执行,直到遇到b

第七章

第七章 控制发光二极管. 尽管linux 驱动直接和硬件打交道,但并不是linux驱动直接向硬件中的内存写数据,而是与本机的i/o内存进行交互.所谓I/O内存是通过各种接口(PCI, USB.蓝牙以太网等)连接到主机的硬件在主机的内存映射.Linux内核提供了多个与I/O内存交互的函数.Linux内核的内存管理模块负责同步I/O内存与硬件的数据. 每一个连接Linux 的硬件在I/O内存中都会有映射首地址.在使用ioread 32.ioread32等函数读写I/O内存时需要指定这些首地址.Led

Swift 控制传递语句

控制传递语句(Control Transfer Statements) 控制转移语句改变你代码的执行顺序,通过它你可以实现代码的跳转.Swift有四种控制转移语句. continue break fallthrough return 我们将会在下面讨论continue.break和fallthrough语句.return语句将会在函数章节讨论. Continue continue语句告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代.就好像在说"本次循环迭代我已经执行完了",但是

第七章随想

第七章 控制发光二极管读后感 本章学的是通过向Linux驱动发送数据可以控制LED小灯的开关. LED的原理就是:Linux驱动与本机的I/O内存进行交互.所谓I/O内存是通过各种接口连接到主机的硬件在主机内存中的映射.Linux内核提供了多个与I/O交互的函数,每一个连接Linux的硬件在I/O内存中都会有映射首地址. 接下来创建LED驱动的设备文件 第一步:使用cdev_init函数初始化cdev 第二步:指定设备号:Linux设备文件的设备号分为主设备号和次设备号.用一个int类型(dev

第七章 循环语句

第七章 循环语句 1.  循环语句的老祖宗--Goto语句(可用do-while();代替) 1 //①goto语句的使用(一般情况不用,但想在多重循环中一下子跳到外面时可以用)*******************① 2 int i=0; 3 number: i++; 4 cout<<"*"; 5 if (i<10) 6 { 7 goto number; 8 } 9 //②可以用do{ } while ();代替 10 int i=0; 11 do 12 { 13

oracle基本语句(第七章、数据库逻辑对象管理)

索引.实体化视图.簇.散列簇.序列.同义词 1.创建表 CREATE TABLE <表名>(<列名1> <数据类型>,--); CREATE GLOBAL TEMPORARY TABLE <表名>(<列名1> <数据类型>,--) ON COMMIT DELETE ROWS TABLESPACE <临时表空间名>;--创建事务级临时表,事务提交后删除临时表中数据 CREATE GLOBAL TEMPORARY TABLE

第七章 LED将为我们闪烁:控制发光二极管

 第七章 LED将为我们闪烁:控制发光二极管 本章我们将会看到一个完整的linux驱动程序,通过linux驱动程序控制LED的四个小灯,通俗的说就是通过向linux驱动程序来控制LED小灯的开关.用到了几个LED代码文件路径:随书光盘.虚拟环境两个. 一.LED驱动的实现原理:linux驱动与硬件打交道的方式是与本届的I/O内存进行交互,而这里所说的I/O内存就是通过各种接口(PCI.USB.蓝牙.以太网接口等)连接到(PC.手机)的硬件(网卡.摄像头等)在主机上的映射,然后进行硬件交互. 二.

Android深度探索(卷1)HAL与驱动开发 第七章 LED将为我闪烁:控制发光二极管

第七章  LED将为我闪烁:控制发光二极管 读书心得    LED驱动的实现原理 尽管Linux驱动程序直接与硬件打交道,但并不是Linux驱动直接向硬件中的内存写数据,而是与本机的I/O内存进行交互. 编写LED驱动 测试LED驱动 LED驱动的移植 在修改Linux驱动的源代码时,应尽量不要修改Linux驱动的借口. LED驱动是本书第一个真正和硬件打交道的Linux驱动,虽然LED驱动并不复杂,只是控制了四个LED,但是LED驱动已经包括了Linux驱动所有必要的部分.一个完整的Linux