[Swift笔记]Swift强大的Switch语句

来源:互联网 发布:淘宝01店手机是真的吗 编辑:程序博客网 时间:2024/05/16 13:49

我们从一个需求来学习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语句笨拙。这真是一个非常棒的体验!

0 0