您的当前位置:首页【Swift初级】强大的Switch语句

【Swift初级】强大的Switch语句

2024-12-13 来源:哗拓教育

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

显示全文