Welcome to Swift (苹果官方Swift文档初译与注解二十七)---189~198页(第四章-- 流程控制)

Switch

  一个switch语句里包含一个值,并且用这个值与其他几个可能的匹配模式进行比较,然后根据成功匹配上的模式,执行相应的代码块.switch语句提供了比if语句更多的选项来相应多种潜  在的情况.

  最简单的一个例子:

    switch some value to consider {

    case value 1:

       respond to value 1

    case value 2,

    value 3:

       respond to value 2 or 3

    default:

       otherwise, do something else

    }

  每一个switch语句都包含多个case关键字.另外为了比较指定的值,Swift针对每个case提供了几种不同的匹配模式,这些将在后面的部分进行说明.

  每个switch的case体都是一个独立的代码执行分支,这与if语句的分支有点类似.switch语句决定哪一个分支会被选中执行.

  switch语句必须是周全的,也就是每种可能的值都会匹配到一个case.如果不是这样,你可以通过关键字default来定义一个默认的case,它默认总是出现在最后面.

  下面的例子使用了switch语句来处理一个小写字符(someCharacter):

    let someCharacter: Character = "e"

    switch someCharacter {

    case "a", "e", "i", "o", "u":

       println("\(someCharacter) is a vowel")

    case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",

    "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":

       println("\(someCharacter) is a consonant")

    default:

       println("\(someCharacter) is not a vowel or a consonant")

    }

    // prints "e is a vowel”

  这个switch语句的第一个case匹配了英语里所有的五个元音,类似的,第二个case匹配了英语中其他小写字母.

  在一个switch的case中写尽其他所有的可能性是不实际的,因此switch语句提供了一个default的case用来匹配其他情况,这样保证switch语句尽量穷尽.

No Implicit Fall through (非默认降落执行)

  与C语言和OC中的switch语句比较,在Swift中switch语句不会在每个case语句后默认的掉落到后面下一个case,相反的,整个switch语句在第一个匹配的case执行完成之后就结束了.  这使得switch比C语言的更加安全和清晰,避免了多个case的执行错误.

  注意点:

  你仍可以在一个匹配的case中,在这个case执行完成之前,提前跳出,如果你需要这样的话.

  每个case比较包含至少一个可以执行的语句,下面代码的写法是错误的,因为第一个case是空的:

    let anotherCharacter: Character = "a"

    switch anotherCharacter {

    case "a":

    case "A":

        println("The letter A")

    default:

       println("Not the letter A")

    }

    // this will report a compile-time error

  不像C语言的switch语句那样不匹配"a" 和 "A",相反编译器会报告错误,case “a”:没有包含任何执行语句.这个方法避免了从一个case掉落的另一个case,使得代码更加安全和干     净.

  在一个switch的case中有多个匹配值可以使用逗号(,)分隔,也可以分成多行来写:

    switch some value to consider {

    case value 1,

    value 2:

       statements

    }

  注意点:

  为了使一个特定的switch可以有掉落的功能,可以使用关键字fallthrough.

Range Matching (范围匹配)

  在switch的case中可以检查值是否包含在一个范围.下面的例子使用数字范围来提供了自然语言的关于任意大小数字的情况:

    let count = 3_000_000_000_000

    let countedThings = "stars in the Milky Way"

    var naturalCount: String

    switch count {

    case 0:

       naturalCount = "no"

    case 1...3:

       naturalCount = "a few"

    case 4...9:

       naturalCount = "several"

    case 10...99:

       naturalCount = "tens of"

    case 100...999:

        naturalCount = "hundreds of"

    case 1000...999_999:

        naturalCount = "thousands of"

    default:

        naturalCount = "millions and millions of"

    }

    println("There are \(naturalCount) \(countedThings).")

    // prints "There are millions and millions of stars in the Milky Way.”

Tuples (元组)

  可以在同一个switch语句中使用元组来测试多个值.元组中的每一个元素都可以用来测试不同的值或者范围.也可以使用下划线(_)标识出任意可能的匹配值.

  下面的例子中,使用与点(x,y)使用一个简单的(Int,Int)类型元组来表示,并它在图形上的位置:

    let somePoint = (1, 1)

    switch somePoint {

    case (0, 0):

        println("(0, 0) is at the origin")

    case (_, 0):

        println("(\(somePoint.0), 0) is on the x-axis")

    case (0, _):

       println("(0, \(somePoint.1)) is on the y-axis")

    case (-2...2, -2...2):

        println("(\(somePoint.0), \(somePoint.1)) is inside the box")

    default:

       println("(\(somePoint.0), \(somePoint.1)) is outside of the box")

    }

    // prints "(1, 1) is inside the box”

    “let somePoint = (1, 1)

    switch somePoint {

    case (0, 0):

       println("(0, 0) is at the origin")

    case (_, 0):

      println("(\(somePoint.0), 0) is on the x-axis")

    case (0, _):

       println("(0, \(somePoint.1)) is on the y-axis")

    case (-2...2, -2...2):

     println("(\(somePoint.0), \(somePoint.1)) is inside the box")

    default:

        println("(\(somePoint.0), \(somePoint.1)) is outside of the box")

    }

    // prints "(1, 1) is inside the box”

    

  例子中,switch语句判断这个点是否在原点(0,0),是否在红色的X轴,是否在橘色的Y轴;是否在蓝色的4*4的盒子内,或者在盒子外.

  不像C语言中的switch允许多个case可以处理同一个值.实际上,上面例子中原点(0,0)可以匹配所有的四种情况,然而如果多种匹配,那么第一个匹配的case总是被选中,因此点(0,0)将  会匹配到case (0, 0),因此所有其他的匹配都会被忽略.

Welcome to Swift (苹果官方Swift文档初译与注解二十七)---189~198页(第四章-- 流程控制),布布扣,bubuko.com

时间: 2024-10-10 22:02:28

Welcome to Swift (苹果官方Swift文档初译与注解二十七)---189~198页(第四章-- 流程控制)的相关文章

Welcome to Swift (苹果官方Swift文档初译与注解三十)---219~224页(第四章-- 流程控制 完)

Labeled Statements  (标签语句) 循环或者switch语句可以嵌套其他的循环或者switch,这样在Swift中可以创建复杂的流程控制结构.循环或者switch语句都可以通过break语句来永久的结束,因此,有时候需要显式的 表明在循环或者switch中你需要break的语句.同样的,如果你嵌套多个循环,显式的表明里面的continue语句也是类似的. 为了达成这个目标,可以在循环语句或者switch语句中使用一个语句标签(statement label),利用这个标签和br

Welcome to Swift (苹果官方Swift文档初译与注解二十一)---140~147页(第三章--集合类型)

第三章 Collection Types (集合类型) 在Swift中,提供了两种集合类型用来存储一组值:数组和字典.数组有序的存储相同类型的值;字典存储无序的相同类型的值.字典可以通过唯一的标识(就是所说的键)来查询和访问. 在Swift中,数组和字典总是要清晰的标明他们存储数据的类型.这就意味着不可以将错误的类型插入到数组或字典中.同时也意味着你是明确了解你要遍历的数组或字典里面数据的类 型.在Swift中,集合要显式的声明类型来保证在开发中都会明确的知道它能处理的数据类型. 注意点: 在S

Welcome to Swift (苹果官方Swift文档初译与注解三十七)---261~265页(第六章-- 闭包)

Inferring Type From Context 上下文类型判断 因为排序的闭包是作为一个参数传递给函数,因此Swift可以判定这个参数的类型和根据sort函数第二个参数判断返回值的类型.这个参数的类型是(String, String) -> Bool,这意味着 String,String以及Bool类型都不需要在闭包定义的时候声明.因为所有的类型都可以由系统判定.因此,返回箭头以及参数名字的括号都可以省略: reversed = sort(names, { s1, s2 in retur

Welcome to Swift (苹果官方Swift文档初译与注解二十三)---154~162页(第三章--集合类型)

Dictionaries (字典) 字典像是一个容器,它可以存放很多相同类型的值.每个值都有与之关联的唯一的键,键在字典里的作用,就像是每个值的身份证标识一样.与数组中的元素不同,字典里的每个元素没有 固定的循序.当你使用字典并且要查询一个值的时候,需要使用值的标识(key)才行.这就像是你在生活里使用一本字典来查找某个单词的定义一样. 在Swift中,字典能够存储的类型需要明确定义.这与OC中的NSDictionary 类和NSMutableDictionary 类很不同,OC中它们可以使用任

Welcome to Swift (苹果官方Swift文档初译与注解三十三)---235~240页(第五章-- 函数)

Default Parameter Values (参数默认值) 在定义函数的时候,你可以给任何参数定义一个默认的值,如果定义了默认值,在调用这个函数的时候,你可以忽略这个参数. 注意: 设置参数默认值的时候,需要按照函数的参数列表最后的开始,这可以确保在调用函数的时候,即使没默认值的参数也可以按顺序的对应上,也使得函数在调用的时候更加清晰. 下面的代码例子是join函数的新版本,它使用了默认参数: func join(string s1: String, toString s2: String

Welcome to Swift (苹果官方Swift文档初译与注解三十)---225~230页(第五章-- 函数)

Functions (函数) 函数是一个执行特定任务的代码段.通过名称来标识和调用它们. 在Swift中,每个函数都有类型,包括函数的参数类型和返回值类型.这些类型与Swift中的其他类型使用起来一样,这使得函数可以作为参数传递给另一个函数,以及可以从一个函数中返 回函数,一个函数也可以写在另一个函数内部,这样可以更有效的封装和嵌套. Defining and Calling Functions (定义和调用函数) 当你在定义函数的时候,你可以选择性的命名一个或者多个参数类型值,以及函数执行后的

Welcome to Swift (苹果官方Swift文档初译与注解二十)---133~139页(第二章..本节完)

Unicode (Unicode码) Unicode是一种国际标准的文本编码.它的标准表中几乎包含所有语言的任意字符,并且可以通过扩展文件或者网页读写这些字符. 在Swift中,String(字符串)类型和Character(字符)类型完全兼容Unicode,而且它们也支持非Unicode码. Unicode Terminology (Unicode 术语) 每个Unicode码都可以用一个或者多个Unicode标量表示.对于一个字符来说,一个Unicode标量都是一个唯一的21位的值(或名称)

Welcome to Swift (苹果官方Swift文档初译与注解二十八)---199~208页(第四章-- 流程控制)

Value Bindings (绑定值) 在switch的case中可以绑定一个或者多个值给case体中的临时常量或者变量,这个成为绑定值. 代码样例: let anotherPoint = (2, 0) switch anotherPoint { case (let x, 0):   println("on the x-axis with an x value of \(x)") case (0, let y):   println("on the y-axis with

Welcome to Swift (苹果官方Swift文档初译与注解二十九)---209~218页(第四章-- 流程控制)

Break break语句会立刻结束整个流程控制的执行.break语句可以在switch语句或者循环语句中帮助你提前结束循环或者switch的执行. Break in a Loop Statement  (循环语句中的break) 当在循环语句中使用break,会立刻结束循环的执行,并且跳转到循环体之后的第一行代码.循环不会再遍历执行了. Break in a Switch Statement (switch语句的break) 当在switch语句中使用break,break会立刻结速switc