虽然 Swift 6
版本就快出来了,但 5.9 版本仍然是有很多内容的值得关注,比如更简单的 if
和 switch
用法、宏 macros
、不可复制类型 noncopyable types
、自定义执行器 custom actor executors
等一系列新功能,Swift 5.9
也是一个大的版本发布,本文将提供示例、解释这个版本中重要的变化,需要在 Xcode 14
中安装最新的 Swift 5.9
,或者使用 Xcode 15 beta
版本来体验测试。
更新内容
if
和 switch
表达式
if
和 switch
表达式可以不需要将形式结果赋值给某个变量,允许我们在返回单个表达式的函数中省略 return
关键字,if
的工作更像三元运算符,
举个栗子
// if
let score = 60
let result1 = if score > 60 { "通过" } else { "不通过" }
print(result1)
// switch
let result2 = switch score {
case 0...59: "不及格"
case 60...80: "良好"
case 80...100: "优秀"
default: "错误"
}
print(result2)
Macros
宏指令
宏很复杂,现在使用起来相当棘手,它允许我们在编译之前动态操作项目的 Swift 代码,允许我们在编译时注入额外的功能,Swift
的宏支持是围绕 Apple
的 SwiftSyntax
库构建的,用于理解和操作源代码,所以必须将其添加为宏的依赖项。我并没有太消化这些,只做一些简单演示。
需要了解的关键事项是:
- 它们是类型安全的,而不是简单的字符串替换,因此需要准确宏将使用哪些数据。
- 它们在构建阶段作为外部程序运行,并不存在于主要的应用程序
Target
中。 - 宏被分解为多个更小的类型,例如
ExpressionMacro
生成单个表达式、AccessorMacro
添加getter
和setter
以及ConformanceMacro
使类型符合协议。 - 宏与解析的源代码一起工作,可以查询代码的各个部分,例如正在操作的属性的名称或它的类型,或者结构中的各种属性。
- 它们在沙箱内工作,并且仅对给定的数据进行操作。
创建 Macros
宏扩展的执行代码
不用把它们创建在 app
主工程 target
内
public struct BuildDateMacro: ExpressionMacro {
public static func expansion(
of node: some FreestandingMacroExpansionSyntax,
in context: some MacroExpansionContext
) -> ExprSyntax {
let date = ISO8601DateFormatter().string(from: .now)
return "\"\(raw: date)\""
}
}
创建 CompilerPlugin
import SwiftCompilerPlugin
import SwiftSyntaxMacros
@main
struct MyMacrosPlugin: CompilerPlugin {
let providingMacros: [Macro.Type] = [
BuildDateMacro.self
]
}
在 Package.swift
文件中添加内容
.macro(
name: "MyMacrosPlugin",
dependencies: [
.product(name: "SwiftSyntax", package: "swift-syntax"),
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
),
这就完成了在创建宏。接下来的代码写在想要使用宏的任何地方,例如app
主工程 target
内。
实际使用
print(#buildDate)
当编译这段代码时,宏功能会在构建时注入,因此,我们 print()
上面的调用将被重写为如下内容:
print("2023-06-05T18:00:00Z")
本文自 https://www.codeun.com 发布,相应代码均自主编写并严格审阅和测试,完整代码中包含丰富的学习笔记和使用方式、实用技巧。
· 如若转载,请注明出处:https://www.codeun.com/archives/1112.html ·