Swift 5.9 有什么新功能?

虽然 Swift 6 版本就快出来了,但 5.9 版本仍然是有很多内容的值得关注,比如更简单的 ifswitch 用法、宏 macros、不可复制类型 noncopyable types 、自定义执行器 custom actor executors 等一系列新功能,Swift 5.9 也是一个大的版本发布,本文将提供示例、解释这个版本中重要的变化,需要在 Xcode 14 中安装最新的 Swift 5.9 ,或者使用 Xcode 15 beta 版本来体验测试。


更新内容

ifswitch 表达式

ifswitch 表达式可以不需要将形式结果赋值给某个变量,允许我们在返回单个表达式的函数中省略 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 的宏支持是围绕 AppleSwiftSyntax 库构建的,用于理解和操作源代码,所以必须将其添加为宏的依赖项。我并没有太消化这些,只做一些简单演示。

需要了解的关键事项是:

  • 它们是类型安全的,而不是简单的字符串替换,因此需要准确宏将使用哪些数据。
  • 它们在构建阶段作为外部程序运行,并不存在于主要的应用程序 Target 中。
  • 宏被分解为多个更小的类型,例如 ExpressionMacro 生成单个表达式、AccessorMacro 添加 gettersetter 以及 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
下一篇 2023-06-05

发表回复

登录后才能评论