• 如何不通过SPM使用 Swift 宏
  • 发布于 1周前
  • 43 热度
    0 评论
前言
Swift 宏是 Swift 5.9 中引入的一项强大的新功能,它允许开发人员在编译时生成代码。可以很好地减少样板代码。由于它们的实现方式以及与 SPM 的紧密结合,Swift 宏通常在 Swift 包中定义,因此,它们通常作为 SPM 依赖项导入到 Xcode 项目。但在某些情况下,你可能不希望或无法将宏导入为 Swift 包依赖项。今天就来讲讲如何不通过 SPM 引入 Swift 宏。

创建 Swift 宏
有两种简单的方法可以创建 Swift 宏:
1.使用 Xcode 创建
2.从命令行工具调用 swift package 命令创建
如果你想使用 Xcode 创建 Swift 宏,首先需要通过单击 File > New > Swift Package... 菜单,然后从列表中选择 Macro 模板来创建一个新的 Swift 包(或者使用快捷键 command + shift + control + N):

然后输入存储位置和名称即可。

第二种方法是使用命令行,打开终端,在指定文件夹输入:
swift package init --name Stringify --type macro
将宏编译为二进制文件
创建好了之后我们需要把宏编译为二进制文件,在命令行中执行:
swift build -c release
这个过程可能有点长,耐心等待成功之后,就可以在 .build > release 文件夹中找到这个二进制文件了:

使用这个宏文件
下一步是把这个二进制文件导入到你的工程,为了文件夹整洁,建议创建一个新的文件夹,比如我这里创建了一个 Macros 文件夹,然后将上一步中生成的二进制文件复制进去:

然后打开项目,在主 Target 的 Build Settings 中,找到 Swift Compiler - Custom Flags,添加两个标记 -load-plugin-executable 和刚刚导入的宏二进制文件的路径,为了能够读到对应的宏函数,还需要再加一个#号拼接上函数名:

只配置这些还是不够的,为了能够让项目访问这个宏,还需要创建一个 Swift 文件,将宏的声明写进去,比如我创建了一个 StringifyMacro.swift :
import Foundation
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(module: "StringifyMacros", type: "StringifyMacro")
最后,就可以在项目中使用了:
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        print(#stringify(2 + 3))
    }
}
然后运行项目,测试成功输出结果:(5, "2 + 3")

用户评论