我们从一个需求来学习Swift中的Switch语句:
在一个平面坐标系中,输入一个点,判断该点位于哪个象限。
/*
这里定义一个函数用来判断输入的点位位于坐标系的位置,
参数即为需要判断位置的点位。(Float, Float)为Swift中的元组类型,这里暂时不去深究。
返回值即为坐标点坐在象限。
*/
func judgePosition(position: (Float, Float)) -> String {
switch position {
case (0, 0):
return "(0, 0)位于原点"
case (let x, 0):
return "(\(x), 0)点位于x轴"
case (0, let y):
return "(0, \(y))点位于y轴"
case let (x, y) where x > 0 && y > 0:
return "(\(x), \(y))点位于第一象限"
case let (x, y) where x < 0 && y > 0:
return "(\(x), \(y))点位于第二象限"
case let (x, y) where x < 0 && y < 0:
return "(\(x), \(y))点位于第三象限"
case let (x, y) where x > 0 && y < 0:
return "(\(x), \(y))点位于第四象限"
default:
return "恭喜你,这是一个异次元的点位~"
}
}
从上面这段代码可以看出,Swift中的switch case比OC和C中的switch语句强大了一百倍不止……在C和OC中的switch语句用得较少,因为功能很有限,但Swift中就不一样了,我们详细来看看。
语句必须是完备的
每一个可能的值都必须至少要有一个case块与之对应,由于总会存在某些不可能覆盖的值,所以,通常default块是必须要写的,而且只能放在语句的最后。
一个case块可以匹配多个值
// 键入一个方向键,判断时哪个方向
func judgeDirection(inputCharacter: Character) {
switch inputCharacter {
case "a", "A":
print("左移")
case "w", "W":
print("上移")
case "d", "D":
print("右移")
case "s", "S":
print("下移")
default:
print("您输入的不是方向键")
}
}
相比C和OC的一个case块只能匹配一个值,Swift的switch语句是不是很爽?
不存在隐式贯穿和显式贯穿
我们可以看到上面的两段代码当中,都没有break,但case语句之间并不会穿透,默认一个case块执行完成后会自动终止该switch语句,而不会继续执行下一个case块。这使得switch更安全易用了。
但假如你真的想语句穿透怎么办呢?那就在需要贯穿的case块最后加入fallthrough
关键字就行了。
使用break结束switch
而swift中switch语句当中用break
通常被用来立即结束这个switch语句。通常是放在default块中。
范围匹配和元组匹配
元组匹配的内容,我们可以从本文的第一段代码可以学习到。
case (0, 0):
假如我输入的是(0 ,0),那和这个条件便是匹配的,程序将会执行这段case块中的代码。
// Swift中的范围匹配
func myScore(score: Float) -> String {
switch score {
//"..."表示闭区间,相当于[90, 100],即90<=x<=100
case 90...100:
return "优秀"
//"..<"表示半开闭区间,相当于[80, 90),即80<=x<90
case 80..<90:
return "良好"
case 70..<80:
return "中"
case 60..<70:
return "及格"
case 0..<60:
return "不及格"
//
case let grade:
return "您输入的成绩\(grade)不合法!"
}
}
值绑定
上面这段代码的便不需要default语句,因为case let grade
语句已经声明了一个变量grade可以匹配所有剩下的值,那么到此switch语句便已经是完备的,所以不需要default块。
where判断语句
我们最后来看官方给出的一段switch语句的学习代码:
func demo4Switch() {
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
}
case let x where x.hasSuffix("pepper"):
表示把vegetable的值赋给x,再判断x中是否有"pepper"后缀,如果有,条件成立,执行该块语句,如果没有,便继续判断后面的条件是否成立。
所以,从上面几个例子,我们可以看出Swift的switch语句非常强大并且简洁,功能更加完善,而且很灵活,不像C和OC的Switch语句笨拙。这真是一个非常棒的体验!