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-)

相关推荐
tangweiguo030519873 小时前
SwiftUI布局完全指南:从入门到精通
ios·swift
kang_jin3 小时前
C语言结构体入门:stu定义与成员使用
c语言·教程·编程语言·入门·结构体
用户79457223954139 小时前
【RxSwift】Swift 版 ReactiveX,响应式编程优雅处理异步事件流
swift·rxswift
战族狼魂21 小时前
XCode 发起视频 和 收到视频通话邀请实现双语功能 中文和俄语
swift
UXbot1 天前
2026年AI全链路产品开发工具对比:5款从创意到上线一站式平台深度解析
前端·ui·kotlin·软件构建·swift·原型模式
报错小能手1 天前
ios开发方向——swift并发进阶核心 @MainActor 与 DispatchQueue.main 解析
开发语言·ios·swift
Highcharts.js1 天前
企业级可视化生态系统|关于Highcharts集成的前端框架、后端编程语言与生态
开发语言·javascript·python·前端框架·编辑器·编程语言·highcharts
报错小能手2 天前
ios开发方向——swift并发进阶核心 async/await 详解
开发语言·ios·swift
用户79457223954132 天前
【Lottie】让设计稿上的动效直接"活"在 App 里
swiftui·swift
Mr_Tony4 天前
Swift 中的 Combine 框架完整指南(含示例代码 + 实战)
开发语言·swift