概览
在实际代码开发中,可能初学 Swift 语言的小伙伴们在撸码时最常用的得数 if 和 switch…case 条件选择语句了。不过在某些场景下它们显得略有那么一丢丢“矫揉造作”,还好从 Swift 5.9 开始苹果知趣的为其简化了语法且增强了它们的表现力。
在本篇博文中,您将学到如下内容:
- 概览
- 1. Swift 中的 if 和 switch 条件语句
- 2. 三元操作符(ternary expression)
- 3. Swift 5.9 if 与 switch 简洁的新语法
- 4. 新语法的“美中不足”
- 总结
“九尺之台起于垒土,千里之行始于足下”,Swift 语言里 if 和 switch…case 语句是任何绝妙 App 搭建的“盘石桑苞”!
那小伙伴们还等什么呢?让我们马上开始燥起来吧!
Let‘s go!!!😃
1. Swift 中的 if 和 switch 条件语句
在任何语言的结构化编程模式中条件与分支判断一直是当仁不让的“绝对核心”,这对于 Swift 语言自然也不例外。
在 Swift 语言中我们可以使用 if…else 语句来表达一般的条件与分支判断逻辑:
if tooBig {reductIt()
} else {usingIt()
}
我们还可以使用 else 子句进一步拓展 if 语句来匹配多种条件:
var number = 11if number == 0 {print("Zero!!!")
} else if number < 0 {print("小于零")
} else if number >= 100 && number < 1000 {print("大于等于 100,且小于1000")
} else {print("\(number) 其它情况")
}
当然,我们也可以用 switch…case 重构上面的 if…else 代码:
switch number {
case 0:print("Zero!!!")
case ..<0:print("小于零")
case 100..<1000:print("大于等于 100,且小于1000")
default:print("\(number) 其它情况")
}
在 Swift 语言中我们同样可以用 if + let 语句的组合来快速捕获可选值(Optional):
var name: String? = "大熊猫侯佩"if let name = name {print("\(name)")
}
从 Swift 5.7 开始,苹果对于上述代码提供了更简洁的语法:
var name: String? = "大熊猫侯佩"if let name {print("\(name)")
}
更进一步,if 语句还可以搭配 case 组合成 if case let 模式匹配语句:
enum MyError: Error {case textTooShort(actual: Int, min: Int)
}let MIN_LEN = 5
let text = "wo"do {if text.count < MIN_LEN {throw MyError.textTooShort(actual: text.count, min: MIN_LEN)}
} catch let my_error as MyError {if case MyError.textTooShort(let actual, let min) = my_error {print("输入文字长度(\(actual))太短了,不能小于(\(min))")} else {print("其它 MyError: \(my_error)")}
} catch {print("Other ERR: \(error)")
}
在上面的代码中,我们使用模式匹配 if case let 语句优雅的将特定错误所绑定的信息解析了出来。
关于 Swift 中模式匹配的进一步详细介绍请小伙伴们移步如下博文观赏:
- Swift 入门之自定义类型的模式匹配(Pattern Matching)
- Swift 初学者趣谈:一招教你记住模式匹配 if case let 的语法,永不忘记
2. 三元操作符(ternary expression)
然而,在某些简单情况下我们希望条件选择语句越简约越好,比如在下面的例子中我们利用 if…else 语句依照条件(isNeedShortName)的不同值产生了对应不同的 personName 变量,一个 personName 要写 3 遍,这你们也能忍?
struct Person {var name: Stringvar shortName: String
}let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = true// personName 变量名称多次出现,略显冗余
let personName: String
if isNeedShortName {personName = hopy.shortName
} else {personName = hopy.name
}
所幸的是和其它语言类似,Swift 也提供了三元操作符(ternary expression)来简化条件选择逻辑:
let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = true
let personName = isNeedShortName ? hopy.shortName : hopy.name
可以看到使用三元操作符让原来繁琐的代码变得“轻骑减从”了。但是因为三元操作符将全部逻辑都放在同一行中,过度使用它有可能让代码变得更加晦涩难懂。
这又该如何是好呢?
更多关于 Swift 基础指令、操作符和语法的系统性学习,请小伙伴们来我的博客专栏恣意吸取养分:
- Swift 语言开发精讲
3. Swift 5.9 if 与 switch 简洁的新语法
前文提到了滥用三元操作符可能出现的一些弊端。
不过别着急,从 Swift 5.9 开始苹果精简和完善了 if 与 switch 的语法,让条件选择既能层次分明又能言简意赅:
let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = truelet personName = if isNeedShortName {hopy.shortName
} else {hopy.name
}
从上面代码可以看出:新语法让秃头码农们只需书写一次 personName 变量。我们硬是将 if…else 语法写出了三元操作符的“小鸟依人”,同时做到了楚楚有致,这让我们怎能“云胡不喜”呢?
新语法同样也可以用在 switch…case 语句上:
enum Size {case small, mid, big
}let size = Size.midlet sizeDesc = switch size {
case .small:"小号"
case .mid:"中号"
case .big:"大号"
}
Swift 5.9 中新语法除了对寻常条件判断表达式的简化“有如神助”以外,我们还可以进一步如法炮制利用它们来精简其它类似的逻辑:
struct Msg {var emergencyDegree = 0var msgColor: Color {switch emergencyDegree {case 0..<5:.graycase 5..<10:.greencase 10..<15:.yellowcase 15..<20:.orangedefault:.red}}
}let msg = Msg(emergencyDegree: 20)
print(msg.msgColor)
比如在上面的代码中,Swift 5.9 新语法在 msgColor 计算属性的定义中为我们解囊相助省去了海量的 return 语句,就问你们赞不赞!?
4. 新语法的“美中不足”
虽然 Swift 5.9 新语法很好很强大,但是目前对于 if 相关的语法还是有一些“限制”的。
首先 if 必须带上 else 子句。
不过,想想这也合情合理,如若不然我们就无法顾及到每种可能的条件了。
另一个局限是新 if 语句中不能出现多行代码,比如下面示例就无法通过编译:
let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = truelet personName = if isNeedShortName {print("for short name")hopy.shortName
} else {print("for full name")hopy.name
}
关于该特性孰是孰非的全面讨论,请大家移步到苹果官方开发者论坛边吃瓜边观赏“神仙打架”:
- discussion about this on the Swift Forums
至此,我们彻底弄明白了 Swift 5.9 中新条件选择语法带来的巨大便利,借助于他的东风我们又可以愉快的进行撸码造福世界人民了,棒棒哒!💯
总结
在本篇博文中,我们介绍了 Swift 语言中条件选择指令的“前世今生”,并讨论了 Swift 5.9 中 if 和 switch 语句更简洁的新语法。
感谢观赏,再会!😎