【Swift初级】强大的Switch语句

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容