Swift 5.9 新特性:if 和 switch 表达式

在 Swift 5.9 的版本中,允许开发者通过省略 return 关键字的用法,学出更加精简的 ifswitch 语句。该特性类似于 Swift 5.1 在闭包内的单个表达式中省略 return 关键字的功能。

虽然更加精简的代码不一定会更加的易读,但省略 return 关键字的 ifswitch 表达式确实是越简洁越易读。通过使用这种用法,可以使你的代码既简洁又易读,达到双赢的局面。

如何使用 if 语句表达式

开发者可以使用 if 语句作为表达式的方式,来减少赋值所需的代码行。假设,我们需要根据当前设备的暗黑模式来进行文本颜色的适配:

ini 复制代码
let textColor: Color 
if isDarkMode { 
textColor = .white 
} else { 
textColor = .black 
}

上面的这种写法可读性很好,而且也能实现需求,但是它占用了六行代码去实现。如果想减少代码行数,我们就可以使用 Swift 5.9 中的这项新特性了。

在 Swift 5.9 中,我们可以将上面的代码写成下面这种格式来减少代码行数:

bash 复制代码
let textColor: Color = if isDarkMode { .white } else { .black }

该写法类似于省略 return 关键字,并且要求 if 语句的每个分支都必须是一行代码的表达式。需要注意的是,该特性需要满足下面的三个条件:

  • if 和 else 必须都有,不能没有 else
  • 每个分支只能有一行代码,不能有多行
  • 每个分支必须返回一个值,不能没有返回值

当然,看到这里可能有的小伙伴会说了,这样的省略代码行数用三目运算符也可以啊。

ini 复制代码
let textColor: Color = isDarkMode ? .white : .black

但是,对于一些开发人员来说(比如说我),三目运算符肯定是比 if-else 难阅读的。

如何使用 switch 语句表达式

在我们日常开发中,当需要 switch 每个 case 返回值时,可能会写成下面这种写法。比如我们需要一个代表四个方向的枚举:

php 复制代码
enum Direction {
    case north, east, south, west
    var direction: String {
        switch self {
        case .north:
            return "北"
        case .east:
            return "东"
        case .south:
            return "南"
        case .west:
            return "西"
        }
    }
}

虽然上面的是可读的代码,但为每个 case 在新行上都编写 return 关键字感觉有点多余。在 Swift 5.9 之前,我们可以用下面这种方式方式缩短此代码:

javascript 复制代码
var direction: String {
    switch self {
    case .north: return "北"
    case .east: return "东"
    case .south: return "南"
    case .west: return "西"
    }
}

在 Swift 5.9 中,我们可以进一步的进行省略,将 return 关键字也省略掉:

javascript 复制代码
var direction: String {
    switch self {
    case .north: "北"
    case .east: "东"
    case .south: "南"
    case .west: "西"
    }
}

这样,就会使得代码紧凑的多了。

总结

使用 ifswitch 语句作为表达式可以减少编写的代码行数,同时也不会减少代码的可读性。与省略闭包内的 return 关键字一样,在 Swift 5.9 中,也可以省略单表达式 ifswitch 语句内的关键字。

相关推荐
2501_915106322 天前
第一次开发 iPhone App,可能碰到的问题,解决办法
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
末代iOS程序员华仔3 天前
iOS 5.6 条例解决方法
flutter·ios·swift
末代iOS程序员华仔3 天前
Guideline 5.6 - Developer Code of Conduct
flutter·ios·swift
sakiko_5 天前
OC基础语法(与Swift对比)-1
开发语言·ios·objective-c·swift
2501_916008895 天前
Flutter 开发 iOS,项目打包成 IPA,命令与免 Xcode两种方法
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
东坡肘子6 天前
举手之劳 -- 肘子的 Swift 周报 #151
人工智能·swiftui·swift
sakiko_6 天前
Swift学习笔记42-SwiftUI的属性包装器(讲解+面试)
笔记·学习·ios·swiftui·swift
weixin_531670899 天前
Interlude起来:动作动画和文字通知哪个更适合休息提醒?Mac上有没有用桌宠做动作引导的软件?
人工智能·macos·mac·swift
Daniel_Coder9 天前
我用 SwiftUI + GRDB 做了一个「按时吃药·服药提醒」App
ios·swiftui·swift·widgetkit
末代iOS程序员华仔10 天前
iOS个人开发者账号申请为啥会被卡住
ios·swift·figma