zoukankan      html  css  js  c++  java
  • 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”

        pastedGraphic.pdf

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

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

  • 相关阅读:
    程序员指引之路
    RPC 远程过程调用浅谈
    坑爹问题总结
    java 中无符号和有符号int的区别以及byte转int
    python学习Day19 1.产生随机数random、2.序列化【json、 pick、shelve】、3.加 密【hashlib 、hmac】 4.文件的操作【shutil】
    python学习Day18 导包、时间模块【time、calendar datetime】、SYS、OS, OS.path模块、项目开放周期&规范
    python学习Day17 五项【导模块的细节:(跨文件导入模块 &模块的两种执行方式) | 包的概念与使用 | 包中的相对导入语法】
    python学习Day16 模块的概念、模块的导入方式【import 模块名、from 模块 imoprt 功能】、模块的搜索路径、链式导入&循环导入
    python学习Day15 生成器send方法、递归、匿名函数、内置函数
    python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式
  • 原文地址:https://www.cnblogs.com/caios/p/3826295.html
Copyright © 2011-2022 走看看