Swift 5.9 有什么新功能?

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

赞 (0)
上一篇 2023-06-03 下午6:03
下一篇 2023-06-05 下午10:32

发表回复

登录后才能评论