swift中if case let常用法

在swift的开发过程中,经常看到不同的if用法,如不注意容易产生误会,所以总结一下if的各种不同用法。

传统的if用法

大部分的语言都会有if语句,有的语言里if还是表达式,用法基本大同小异,在swift里面同样存在这种用法,也是最常用的用法

 if condition {
     statements
 } else {
     statements
 }

其中condition是一个布尔表达式

optional Binding用法

在swift中增加了Optional对象后,经常要对一个Optional对象进行nil判断,比如

func test(_ par: String?) {
    if par != nil {
        let newStr = par!
        let len = newStr.count
    }
}

由于这样的判断十分常用,所以就有了optional binding的语法以方便使用

if let newStr = par {
    let len = newStr.count
}

optional binding的条件在if语句中以letvar开头,后面newStr是一个绑定操作,如果par是nil,则绑定失败,如果par不是nil,则par的值绑定在newStr上,绑定成功

模式匹配

pattern是swift里面非常好用的语法,主要应用在switch case里面,在if语句里也可以同样使用,在if语句中以case开始的条件都属于模式匹配条件,比如判断一个整数x是不是在[6,12)区间内,

//传统用法
if x>=6 && x < 12 { 

}
//模式匹配用法
if case 6..<12 = x {

}

复杂一点,如果x是Optional对象,这里可以采用嵌套的模式匹配

//传统用法
if let x = x, x>=6 && x < 12 { 

}
//模式匹配用法
if case .some(6..<12) = x {

}

pattern有很多种,看一下官方文档

GRAMMAR OF A PATTERN
pattern → wildcard-pattern
pattern → identifier-pattern
pattern → value-binding-pattern
pattern → tuple-pattern
pattern → enum-case-pattern
pattern → optional-pattern
pattern → type-casting-pattern
pattern → expression-pattern

这里不详细介绍这些pattern,更多的应该switch里面去学习,也就是说switch里面可以使用的在if里面都可以使用
这里举一些例子

1. type-casting-pattern

var t : Any = 10
if case is Int = t {
    print("bingo")
}
if t is Int {

}

上面两种用法结果是一样的,一种是模式匹配,另外一种是常用的is operator

2. tuple-pattern

if case (1..<10, 1..<20) = (7, 8) {

}

在这里(1..<10, 1..<20)是一个pattern,而不是普通的tuple,这里会对左右两边的tuple的元素一一进行patteren match
如果把前面换成一个tuple就会出错里,试试看下面的代码

let pattern = (1..<10, 1..<20)
if case pattern = (7,8) {

}

3. optional-pattern

var t : Any? = 10
// 判断t是不是nil,和判断 t != nil 等效
if case _? = t {

}
//判断t是不是nil,如果有值则绑定到x
if case let x? = t {

}

4. expression-pattern

前面提到的case 6..<12 = x实际上就是这一种pattern,实际上这里调用了一个函数,也是一个操作符~=

    func ~= (pattern: String, value: Int) -> Bool {
        return pattern == "\(value)"
    }
    if case "123" = 123 {

    }

通过重载~=操作符,我们可以实现很多自定义的模式匹配,结合起来可以有很多有趣的用法

上面通过一些例子介绍了if中的模式匹配用法,在代码中也有常常遇到这种用法,这种用法可以看成是switch case的一种简易写法,这样理解起来就比较容易了

if case expression1 = expression2 {
    statements
}
//等价于
switch expression2 {
    case expression1:
        statements
    default:
        break
}

#available用法

这是一种特殊的if用法,用来判断运行环境

if #available(platform name version, ..., *) {
    statements to execute if the APIs are available
} else {
    fallback statements to execute if the APIs are unavailable
}

这个比较简单,不再介绍

混合使用

上面四种if的使用方法可以混合使用,在一个if语句中可以有多个condition,通过,分开,这些condition会依序执行

var t : Any? = 10

if case let xs? = t, xs is Int {
    print("bingo")
}

这里会首先将t进行optional-pattern的匹配和绑定,然后判断xs是否是Int
condition之前常用&&操作符进行的判断也可以换成使用逗号分割,效果是一样的

最后看一下官方文档对ifcondition list的描述

GRAMMAR OF AN IF STATEMENT
if-statement → if condition-list code-block else-clause
else-clause → else code-block | else if-statement

condition-list → condition | condition , condition-list
condition → expression | availability-condition | case-condition | optional-binding-condition
case-condition → case pattern initializer
optional-binding-condition → let pattern initializer | var pattern initializer

总结

这里对if的几种用法做了一些示例和介绍,主要是要能读懂其他人的代码,自己也可以灵活使用if语句。
这里对condition的描述都可以应用在whileguard语句里, 同样可以灵活的使用。

参考文档

https://docs.swift.org/swift-book/ReferenceManual/Statements.html#grammar_branch-statement
https://docs.swift.org/swift-book/ReferenceManual/Patterns.html

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

推荐阅读更多精彩内容