import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
/**
switch 试图把某个值与若干个模式(pattern)进行匹配。
如果第一个模式匹配成功,switch 语句会执行对应的代码。
switch 语句最简单的形式就是把某个值与若干个相同类型的值作匹配:
switch 语句由若干个 case 构成。
每个 case 都是一条分支,与if语句类似。
switch 语句会决定哪一条分支应该被执行。
switch 语句必须是完整的。这就是说,每一个可能的值都必须至少有一个 case 与之对应。
在不能覆盖所有值的情况下,使用默认(default)分支处理,默认分支只能在 switch 语句的最后面。
*/
let a = 0
switch a {
case 1,2 :
print("case 1,2 a = \(a)")
case 3,4 :
print("case 3,4 a = \(a)")
case 5,6 :
print("case 5,6 a = \(a)")
case 7,8 :
print("case 7,8 a = \(a)")
case 9,10 :
print("case 9,10 a = \(a)")
default :
print("default == a = \(a)")
}
/**
Swift 的 switch 与 C 语言和 Objective-C 是不同的。
当匹配的 case 分支中的代码执行完毕后,switch就终止了,不会继续执行下一个 case 分支。
这也就是说,不需要在 case 分支中显式地使用 break 语句。
这使得 switch 语句更安全、更易用,也避免了因忘记写 break 语句而产生的错误。
当然也可以在 case 分支中的代码执行完毕前 break
break之后的代码就不执行了,
如果一个case没有执行的语句,就写下一个case,会报错
避免从一个 case 分支贯穿到另外一个,使代码更安全、更直观
*/
//MARK: 范围匹配
/*
case 分支的模式也可以是一个值区间
*/
let count = 18
switch count {
case 1...5 :
print("1~5 count==\(count)")
case 6...10 :
print("6~10 count==\(count)")
case 11...15 :
print("11~15 count==\(count)")
case 16...20 :
print("16~20 count==\(count)")
default:
print("default count==\(count)")
}
/**
switch 语句中可以使用 元组 测试多个值。
元组中的元素可以是值,也可以是区间。另外,使用下划线(_)来匹配所有可能的值。
Swift 允许多个 case 匹配同一个值。
实际上,在这个例子中,点(0, 0)可以匹配所有四个 case。
但是,如果存在多个匹配,那么只会执行第一个被匹配到的 case 分支。
考虑点(0, 0)会首先匹配case (0, 0),因此剩下的能够匹配(0, 0)的 case 分支都会被忽视掉
*/
let point = (1,0)
switch point {
case (0,0) :
print("在原点上")
case (_,0) :
print("在x轴上")
case (0,_):
print("在y轴上")
case (-2...2,-2...2) :
print("在矩形区域内")
default:
print("在矩形区域外")
}
//MARK: 值绑定
/**
值绑定(value binding):case 分支允许将要匹配的值绑定给临时常量或变量,这些常量或变量在该 case 分支可以被引用
*/
let point1 = (2,3)
switch point1 {
case (let x , 0) :
print("在y轴上 x==\(x)")
case ( 0 ,let y) :
print("在x轴上 y==\(y)")
case (let x,let y) :
print("没有在轴上 x==\(x),y==\(y)")
}
/**
这三个 case 都声明了常量 x 和 y 的占位符,用于临时获取元组 point1 的一个或两个值。
第一个 case ——case (let x, 0)将匹配一个纵坐标为0的点,并把这个点的横坐标赋给临时的常量x。
第二个 case ——case (0, let y)将匹配一个横坐标为0的点,并把这个点的纵坐标赋给临时的常量y。
一旦声明了这些临时的常量,它们就可以在其对应的 case 分支里引用。
在这个例子中,用print进行打印。
这个switch语句不包含默认分支。
这是因为最后一个 case ——case let(x, y) 可以匹配余下所有值的元组。
这使得 switch 语句已经完整了,因此不需要默认分支
在上面的例子中,x 和 y 是常量,这是因为没有必要在其对应的 case 分支中修改它们的值。
它们也可以是变量 —— 程序会创建临时变量,并用相应的值初始化它。
修改这些变量只会影响其对应的 case 分支。
*/
/**
case 分支模式可以使用 where 语句判断额外的条件
*/
let point2 = (-4,4)
switch point2 {
case let(x,y) where x==y :
print("x==y 在正对角线上")
case let(x,y) where x == -y :
print("x==-y 在负对角线上")
case let(x,y) :
print("不在对角线上")
}
/*
在上面的例子中,switch 语句会判断某个点是否在正对角线 x == y 上,
是否在负对角线 x == -y 上,或者不在对角线上。
这三个 case 都声明了常量 x 和 y 占位符,用于临时获取元组 point2 的两个值。
这些常量被用作 where 语句的一部分,从而创建一个动态的过滤器 (filter)。
当且仅当 where 语句的条件为 true 时,匹配到的 case 分支才会被执行。
就像是值绑定中的例子,由于最后一个 case 分支匹配了余下所有可能的值,
switch 语句就已经完备了,因此不需要再书写默认分支
*/
}
}