更加强大的 switch

switch

  • switch 语句会将一个值与多个可能的模式匹配。然后基于第一个成功匹配的模式来执行合适的代码块
  • switch 语句一定得是全面的。就是说,给定类型里每一个值都的被考虑到并且匹配到一个 switch 的 case。如果无法提供一个 switch case 所有可能的值,你可以定义一个磨人匹配所有的 case 来匹配所有未明确出来的值。这个匹配所有的情况用关键字 default 标记,并且必须在所有 case 的最后出现。
  • Objective-C switch 语句如果不全面,仍然可以运行

没有隐式贯穿

  • 相比 C 和 Objective-C 里的 switch 语句来说,Swift 里的 switch 语句不会磨人从匹配 case 的末尾贯穿到下一个 case 里
  • 相反,整个 switch 语句会在匹配到第一个 switch 的 case 执行完毕之后退出,不再需要显示的 break 语句
  • 每一个 case 的函数体必须包含至少一个可执行的语句
  • 在一个 switch 的 case 中匹配多个值可以用逗号分隔,并且可以写成多行

区间匹配

  • switch 的 case 的值可以在一个区间中匹配

元组匹配

  • 可以使用元组来在一个 switch 语句中测试多个值
  • 使用下划线 (_) 来表明匹配所有可能的值

值绑定

  • switch 的 case 可以将匹配到的值临时绑定为一个常量或者变量,来给 case 的函数体使用
    如果使用 var 关键字,临时的变量就会以合适的值来创建并初始化。对这个变量的任何改变都只会在 case 的函数体内有效。

where 子句

  • switch case 可以使用 where 子句来检查是否符合特定的约束

复合匹配

  • 多种情况共享同一个函数体的多个情况可以在 case 后写多个模式来复合匹配,在每个模式之间用逗号分隔。如果任何一个模式匹配了,那么这个情况都会被认为是匹配的。如果模式太长,可以把它们写成多行。

复合绑定 - 值绑定

复合匹配同样可以包含值绑定。所有复合匹配的模式都必须包含相同的值绑定集合,并且复合情况中的每一个绑定都得有相同的类型格式。这才能确保无论复合匹配的那部分命中了,接下来的函数体中的代码都能访问到绑定的值并且值的类型也都相同。

代码示例
let char: Character = "z"

// 该 switch 输出 the last letter of alphabet
switch char {
case "a":
    print("the first letter of alphabet")
case "z":
    print("the last letter of alphabet")
    // 注释掉 default 会报错
    // 报错提示在 switch 行,报错内容为 “Switch must be exhaustive”
default:
    print("other letter")
}

// 该 switch 输出 the last letter of alphabet
switch char {
    // 复合匹配
case "a", "A":
    print("the first letter of alphabet")
case "z":
    print("the last letter of alphabet")
default:
    print("other letter")
}

// 区间匹配
let count = 62
var naturalCount: String

switch count {
case 0:
    naturalCount = "none"
case 1..<12:
    naturalCount = "a free"
case 12..<100:
    naturalCount = "dozens of"
case 100..<1000:
    naturalCount = "hundreds of"
default:
    naturalCount = "many"
}

// 输出 dozens of
print(naturalCount)


// 元组匹配
let somePoint = (1, 1)

// 输出 point in box
switch somePoint {
case (0, 0):
    print("point at origin")
// 元组匹配的值绑定
case (let x, 0):
    print("point at x-axis, distance is \(x)")
case (0, _):
    print("point at y-axix")
case (-2...2, -2...2):
    print("point in box")
// 增加限定条件
case let (x, y) where x == y:
    print("x = y")
default:
    print("point at other palce")
}



我的微信公众号:“码农UP2U”

推荐阅读更多精彩内容

  • 本章将会介绍 控制流For-In 循环While 循环If 条件语句Switch 语句控制转移语句 continu...
    寒桥阅读 201评论 0 0
  • Swift provides a variety of control flow statements. Thes...
    绿色庄园阅读 152评论 0 0
  • 控制流 Swift提供了各种控制流程语句。这些包括while循环多次执行任务; if,guard以及switch基...
    Fuuqiu阅读 45评论 0 0
  • Swift提供了多种控制流声明。包括while循环来多次执行一个任务;if,guard和switch声明来根据确定...
    BoomLee阅读 621评论 0 3
  • 控制流 [TOC] Swift提供了多种流程控制结构,包括可以多次执行任务的while循环,基于特定条件选择执行不...
    伍哥___阅读 25评论 0 0