Swift 5.3 内置于 Xcode 12,新增了多项实用功能。
多尾随闭包
Swift 5.3 之前即使有多个尾随闭包也只有最后一个能被写成精简的形式,这种写法一个闭包在圆括号内,另一个在外面。新的写法把这些闭包都放在圆括号外面,显得更加简洁。注意:尾随闭包中的第一个闭包的标签会被强制省略。
- UIKit
UIView.animate(withDuration: 0.5) {
// animation code
} completion: { _ in
// completion code
}
- SwiftUI
struct ContentView: View {
var body: some View {
Button {
print("login")
}
label: {
Text("登录")
}
}
}
可比较枚举
枚举现在可以进行比较。
代码语言:javascript复制enum Size: Comparable {
case xs
case sm
case md
case lg
}
let small = Size.sm
let large = Size.lg
if small < large {
print("small < large")
}
异常catch多值处理
Swift 5.3 以后,catch 后面可以捕获多个异常的值。
代码语言:javascript复制enum FileReadError: Error {
case FileISNull
case FileNotFound
}
func readFileContent(filePath: String) throws -> String {
if filePath == "" {
throw FileReadError.FileISNull
}
if filePath != "/User/Desktop/123.plist" {
throw FileReadError.FileNotFound
}
return "123"
}
do {
let result = try readFileContent(filePath: "abc")
print(result)
} catch FileReadError.FileISNull, FileReadError.FileNotFound { // 同时处理
print("出现错误")
} catch {
// 有一个隐含参数 error
print(error)
}
@main
声明程序的入口点,替换掉以前的@UIApplicationMain
。
- UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
}
- SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
self改变
以前闭包中引用当前范围的内容时必须带上self.
,Swift 5.3 之后如果不产生循环引用可以省略self.
。这个新特性对 SwiftUI 来说非常友好,因为 SwiftUI 中的 View 保存在值类型的结构体中,所以不会发生循环引用。
struct ContentView: View {
@State private var count = 1
var body: some View {
VStack {
Button {
count = 1 // 可以不用self.count
} label: {
Text(" 1")
}
Text("(count)")
}
}
}
didSet性能提升
以前在一个属性中使用 didSet 时,总是调用 getter 来获取该属性的 oldValue(即使没有用到),从而影响性能。Swift 5.3 之后只有在didSet
中使用了oldValue
参数时,getter 才会被调用。
class Person {
var age = 10 {
didSet {
print("age didSet")
}
}
var sex = "男" {
didSet {
print(oldValue) // 使用oldValue
print("sex didSet")
}
}
}
let p = Person()
// 不会调用getter
p.age = 20
// 会调用getter
p.sex = "女"
语法缩进改进
guard 和 if 语句中的条件可以按列对齐。
代码语言:javascript复制guard let x = optionalX,
let y = optionalY else {
}
if let x = optionalX,
let y = optionalY {
}
新增浮点型Float16
代码语言:javascript复制let number: Float16 = 5.0
新增日志API
提供了 5 种级别:
- Debug:Debug时使用。
- Info:可以在排查问题时使用。
- Notice (default):默认,可以在排查问题时使用。
- Error:在程序执行出错时使用。
- Fault:在程序出现bug时使用。
// 1.导入模块
import os
// 2.创建Logger实例
let logger = Logger()
// 3.使用log函数
logger.log(level: .debug, "test")
logger.log(level: .info, "test")
logger.log(level: .default, "test")
logger.log(level: .error, "test")
logger.log(level: .fault, "test")