let vector = (1,1) switch vector{ case (0,0): print("原点") case (1,0): print("x轴正方向上的单位向量") case (-1,0): print("x轴负方向上的单位向量") case (0,1): print("y轴正方向上的单位向量") case (0,-1): print("y轴负方向上的单位向量") default: print("仅仅是一个普通向量") }
let vector = (x:1,y:1) switch vector{ case (0,0): print("原点") case (_,0): print("(\(vector.x),\(vector.y))向量在x轴上") case (0,_): print("(\(vector.x),\(vector.y))向量在y轴上") case (-2...2,-2...2): print("(\(vector.x),\(vector.y))向量在原点附近") default: print("仅仅是一个普通向量") }
元组的解包也可以融入到case语句中:
1 2 3 4 5 6 7 8 9 10 11 12
let point:(Int,Int) = (8,8) switch point{ case (0,0): print("原点") case (let x,0): print("在x轴上,x = \(x)") case (0,let y): print("在y轴上,y = \(y)") case (let x,let y): print("普通向量:(\(x),\(y))") } // 以上的语句不需要default,因为已经涵盖了所有的可能
let point:(Int,Int) = (0,0) switch point{ case (0,0): print("原点") fallthrough case (_,0): print("在x轴上") fallthrough case (0,_): print("在y轴上") default: print("普通向量") }
看一个实际问题:找出方程x^4 - y^2 = 15 * x * y在300以内的第一个整数解,使用swift,我们可以这样:
1 2 3 4 5 6 7 8 9 10
// 给最外层的循环设置一个label findAnswer: for m in1...300{ for n in1...300{ if m * m * m * m - n * n ==15* m * n{ print("找到一组解,m = \(m),y = \(n)") break findAnswer } } }
以上就给swift加上了goto语句的特性。
switch中的where
1 2 3 4 5 6 7 8 9
let p = (3,3) switch p { caselet (x,y) where x == y: // 先解包然后执行判断逻辑 print("点在y=x这条正比例函数上") case (let x,let y) where x ==-y: print("点在y=-x这条正比例函数上") caselet (x,y): print("普通点") }