Swift 5.9 中 if 与 switch 语句简洁新语法让撸码更带劲

概览

在实际代码开发中,可能初学 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 语句来表达一般的条件与分支判断逻辑:

swift 复制代码
if tooBig {
	reductIt()
} else {
	usingIt()
}

我们还可以使用 else 子句进一步拓展 if 语句来匹配多种条件:

swift 复制代码
var number = 11

if 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 代码:

swift 复制代码
switch number {
case 0:
    print("Zero!!!")
case ..<0:
    print("小于零")
case 100..<1000:
    print("大于等于 100,且小于1000")
default:
    print("\(number) 其它情况")
}

在 Swift 语言中我们同样可以用 if + let 语句的组合来快速捕获可选值(Optional):

swift 复制代码
var name: String? = "大熊猫侯佩"

if let name = name {
    print("\(name)")
}

从 Swift 5.7 开始,苹果对于上述代码提供了更简洁的语法:

swift 复制代码
var name: String? = "大熊猫侯佩"

if let name {
    print("\(name)")
}

更进一步,if 语句还可以搭配 case 组合成 if case let 模式匹配语句:

swift 复制代码
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 中模式匹配的进一步详细介绍请小伙伴们移步如下博文观赏:

2. 三元操作符(ternary expression)

然而,在某些简单情况下我们希望条件选择语句越简约越好,比如在下面的例子中我们利用 if...else 语句依照条件(isNeedShortName)的不同值产生了对应不同的 personName 变量,一个 personName 要写 3 遍,这你们也能忍?

swift 复制代码
struct Person {
    var name: String
    var 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)来简化条件选择逻辑:

swift 复制代码
let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = true
let personName = isNeedShortName ? hopy.shortName : hopy.name

可以看到使用三元操作符让原来繁琐的代码变得"轻骑减从"了。但是因为三元操作符将全部逻辑都放在同一行中,过度使用它有可能让代码变得更加晦涩难懂。

这又该如何是好呢?

3. Swift 5.9 if 与 switch 简洁的新语法

前文提到了滥用三元操作符可能出现的一些弊端。

不过别着急,从 Swift 5.9 开始苹果精简和完善了 if 与 switch 的语法,让条件选择既能层次分明又能言简意赅:

swift 复制代码
let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = true

let personName = if isNeedShortName {
    hopy.shortName
} else {
    hopy.name
}

从上面代码可以看出:新语法让秃头码农们只需书写一次 personName 变量。我们硬是将 if...else 语法写出了三元操作符的"小鸟依人",同时做到了楚楚有致,这让我们怎能"云胡不喜"呢?

新语法同样也可以用在 switch...case 语句上:

swift 复制代码
enum Size {
    case small, mid, big
}

let size = Size.mid

let sizeDesc = switch size {
case .small:
    "小号"
case .mid:
    "中号"
case .big:
    "大号"
}

Swift 5.9 中新语法除了对寻常条件判断表达式的简化"有如神助"以外,我们还可以进一步如法炮制利用它们来精简其它类似的逻辑:

swift 复制代码
struct Msg {
    var emergencyDegree = 0
    
    var msgColor: Color {
        switch emergencyDegree {
        case 0..<5:
            .gray
        case 5..<10:
            .green
        case 10..<15:
            .yellow
        case 15..<20:
            .orange
        default:
            .red
        }
    }
}

let msg = Msg(emergencyDegree: 20)
print(msg.msgColor)

比如在上面的代码中,Swift 5.9 新语法在 msgColor 计算属性的定义中为我们解囊相助省去了海量的 return 语句,就问你们赞不赞!?

4. 新语法的"美中不足"

虽然 Swift 5.9 新语法很好很强大,但是目前对于 if 相关的语法还是有一些"限制"的。

首先 if 必须带上 else 子句。

不过,想想这也合情合理,如若不然我们就无法顾及到每种可能的条件了。

另一个局限是新 if 语句中不能出现多行代码,比如下面示例就无法通过编译:

swift 复制代码
let hopy = Person(name: "大熊猫侯佩", shortName: "hopy")
let isNeedShortName = true

let personName = if isNeedShortName {
    print("for short name")
    hopy.shortName
} else {
    print("for full name")
    hopy.name
}

关于该特性孰是孰非的全面讨论,请大家移步到苹果官方开发者论坛边吃瓜边观赏"神仙打架":

至此,我们彻底弄明白了 Swift 5.9 中新条件选择语法带来的巨大便利,借助于它的东风我们又可以愉快的进行撸码造福世界人民了,棒棒哒!💯

总结

在本篇博文中,我们介绍了 Swift 语言中条件选择指令的"前世今生",并讨论了 Swift 5.9 中 if 和 switch 语句更简洁的新语法。

感谢观赏,再会!8-)

相关推荐
Moonbit4 小时前
双周报Vlo.74:用于表示错误的 ! 语法被替换为关键字 raise、错误多态支持:高阶函数现可接受带错误的回调
编程语言
Mirageef9 小时前
aardio 模块化管理
编程语言
大熊猫侯佩12 小时前
Swift 初学者秘技:如何用模块(Module)进一步细粒度控制代码访问控制
swift·apple
iOS阿玮12 小时前
苹果审核被拒,其实可以靠回复也能过审
uni-app·app·apple
大熊猫侯佩12 小时前
SwiftUI 调整视图内容周围间隙(Content Margins)的“时髦”方法
swiftui·swift·apple
Eden小峰12 小时前
ReactiveSwift 核心操作符
swift
I烟雨云渊T2 天前
iOS swiftUI的实用举例
ios·swiftui·swift
大熊猫侯佩2 天前
SwiftUI 中为何 DisclosureGroup 视图在收缩时没有动画效果?
swiftui·swift·apple