虽然 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 ·