- switch语句会将一个值与多个可能的模式匹配。然后基于第一个成功匹配的模式来执行合适的代码块。
- switch语句一定得是全面的。就是说,给定类型里每一个值都的被考虑到并且匹配到一个switch的case。如果无法提供一个switch case所有可能的值,你可以定一个默认匹配所有的case来匹配所有未明确出来的值。这个匹配所有的情况用关键字default标记,并且必须在所有case的最后面出现。
- Object-C switch 语句如果不全面,仍然可以运行。
- 相比C和 Object -C里的switch语句来说。switch里的switch语句不会默认从匹配case的末尾贯穿到下一个case里。
- 相反,整个switch 语句会在匹配到第一个switch的case执行完毕之后推出,不再需要显示的break语句。
- 每一个case的函数体必须包含至少一个可执行语句。
- 在一个switch的case中匹配多个值可以用逗号分隔,并且可以写成多行。
- switch的case的值可以子啊一个区间中匹配。
- 可以使用元组来在一个switch语句中测试多个值。
- 使用下划线(_)来表明匹配所有可能的值。
- switch的case可以将匹配到的值临时绑定为一个常量或变量,来给case的函数体使用。
- 如果使用var 关键字,临时变量就会以合适的值来创建并初始化。对着变量的任何改变都只会在case的函数体内有效。
- Switch case可以使用where分句来检查是否符合特定的约束。
- 多种情形共享同一个函数体的多个情况可以在case后写多个模式来复合,在每个模式之间用逗号分隔。如果任何一个模式匹配了,那么这个情况都会被认为是匹配的。如果模式太长,可以把他们写成多行。
- 复合匹配同样可以包含值绑定。所有复合匹配的模式都必须包含相同的值绑定集合,并且复合情况中的每一个绑定都得相同的类型格式。这才能确保无论复合 匹配的那部分命中了,接下来的函数体中的代码都能访问到绑定的值并且值的类型也相同。
import UIKit///switch 语句
//1、必须全面有default/** 错误写法let c:Character = "z"switch c {case "a":print("the first letter of alphabet")case"z":print("the last letter of alphabet")}*/let c:Character = "z"
switch c {
case "a":print("the first letter of alphabet")
case"z":print("the last letter of alphabet")
default:print("other")//结果:the last letter of alphabet
}//2、复合绑定let c2 = "a"
switch c2 {
case "a","i","o","u":print("元音字母")//结果:元音字母
case "b","c","d":print("辅音字母")
default:print("其他字母")
}//3、区间匹配let count = 62
switch count{
case 0:print("none")
case 1...5:print("a few")
case 6..<12:print("several")
case 13..<100:print("dozons of")//结果:dozons of
case 100...100:print("hundreds of")
default:print("any")
}//4、元组匹配let point = (1,1)switch point {
case (0,0):print("point at origin")
case (_,0):print("point at x-axis")
case (0,_):print("point at y-axis")
case (-2...2,-2...2):print("point in the box")//结果:point in the box
default:print("point out of the box")
}//5、值绑定
let size = (1,0)
switch size{
case (let x,0):print("x is \(x), when y is 0")
case(0,let y):print("y is \(y), when x is 0")
default:print("other")
}//6、where 子句
switch size {
case (let x,let y) where x == y:print("size x = y")
case (let x,let y) where x == -y:print("size x = y")
case (let x,let y) where x > y://结果:size x > yprint("size x > y")
default:print("other")
}