Swift进阶之样式匹配

对于Swift的样式匹配,你知道多少呢,这里让bekin简单介绍一些在实际应用中可以让你快速判断一些条件,或者是分支的样式匹配语法,会大大简化你的代码量,话不多说,直接上代码:

1,if let的使用

这个相信大家也用的很多了,这个在判断optional值的时候非常有用,例如判断window的根控制器是不是导航控制器,接下来并且需要用这个导航控制器干点啥的时候,可以这样简写

if let nav = self.window?.rootViewController as? UINavigationController {

            ///do something

        }

if let 可以不仅仅在判断条件成立的时候执行代码,还可以绑定=后面的值到let的常量中,当然把let换成var也是可以的,是不是简便很多,相信很多人会这样用了,接下来说说其他的

2,if case的使用

比如有一个坐标点point (x: 100, y: 0),当你想判断该坐标是不是在原点的时候,以前你的代码或许是这样的:

if point.x == 0 && point.y == 0 {

    ///do something

}

用样式匹配以后,代码是这样的:

if case (0, 0) = point {

    ///do something

}

是不是简洁很多,当然配上我们的value binding那就更爽啦,比如现在只想判断这个点在不在y轴,同时还需要用到point的x轴的值,那么可以这样用:

if case(let x, 0)  = point {

    print("Y轴,X为:\(x)")

}

如果不需要x的值,更可以省略x的值判断了,像这样:

if case(_, 0)  = point {

    print("在Y轴")

}

这样用起来是不是方便很多

3,switch...case...的用法

还是2里面提到的point,如果同时需要判断在原点,在x轴,在y轴,一起其他情况的时候,我们可以用switc...case

switch point {

case(0,0):

    print("原点")

case(_,0):

    print("Y轴")

case(0,_):

    print("X轴")

default:

    print("不在X轴,也不再Y轴")

}

如果要value binding,那就和上面的if case一样

4,for...case的用法

比如有一个数组 nums [1, 2, 3, 4]

当我们判断只要2在里面的时候就干一些事情,当然你可以调用数组的API contains方法,这里不说这个,我们用样式匹配符可以这样:

for case 2 in nums {

     print("找到2啦,你可以干一些活啦")

}

不过需要说明的是,如果数组里面有多个元素2,那么这个print将会执行2的count次,也就是说不管有没有找到2,这个for case都会把这个数组for循环完毕,这个大家用的时候需要注意

当然还有更高级的用法,比如numsO [1, 2, 3, nil, 6, nil, 10]这样一个数组,如果要在元素不为空的时候干一些事情,那么你可以这样写:打印结果为:1,2,3,6,10,

for case let n? in numsO {

    print(n)

///do something

}

是不是很有意思!!!

5,在if或者是for后面添加where的用法

比如有一个表示电池电量的枚举BatteryPower ,有三种状态,一种是没电了outOfPower,一种是full,另外一种是normal,但是现在需要在normal的基础上根据电量的百分比增加两种状态,一种的低电量状态,另外一种是几乎满电状态,那么可以在switc case的时候加上where来加以限制,代码如下:

enum BatteryPower  {

    case full, outOfPower

    case normal(percent: Double)

}

var battery: BatteryPower = .normal(percent:0.25)

switch battery {

    case.full:

        print("full power")

    case .outOfPower:

        print("out of power")

    case.normal(let p) where p <= 0.2:

        print("almost out of power")

    case.normal(let p) where p  >= 0.8:

        print("almost full power")

    default:

        print("normal power")

}

当然where不仅仅可以用在switch...case里面,还可以配上for循环,if条件判断使用,例如针对2里面提到的数组nums  [1, 2, 3, 4],如果仅仅是在元素的值为偶数的时候需要做一些事情,你可以这样写:这样你就不需要在for循环里面添加if判断了,是不是感觉简化很多了

for n in nums where n %2 == 0 {

    print(n)

}

以上局势针对样式匹配符的一些简单介绍和应用

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

推荐阅读更多精彩内容