使用“Swift 宏”(从 Swift 5.9 开始)来声明类、结构、协议等名称?

Use "Swift Macro" (from Swift 5.9) to declare class, struct, protocol and etc. names?

提问人:Gargo 提问时间:11/8/2023 最后编辑:Gargo 更新时间:11/9/2023 访问量:77

问:

在 Objective-C 中,我们可以根据其含义编写类似内容并用“A”替换所有“B”项。#define A B

现在在 Swift 5.9 中,Apple 引入了 Swift Macro(它添加了处理宏的高级工具),但关于它的信息太少了,我找到了如何仅将这项技术用于纯字符串:

@freestanding(expression)
public macro stringify() -> String = #externalMacro(module: "SomeMacroMacros", type: "StringifyMacro")

public struct StringifyMacro: ExpressionMacro {
    public static func expansion(
        of node: some FreestandingMacroExpansionSyntax,
        in context: some MacroExpansionContext
    ) -> ExprSyntax {
        "\"Test\""
}

print(#stringify) //outputs "Test"

但是,如果我想替换类、结构、协议名称声明怎么办?一般来说,Swift Macro 可以吗?

以下代码不起作用。我只是用它来解释我需要用 Swift 宏实现什么:

#define SomeClass SomeAnotherClass

class SomeClass {
  ...
}
swift-macro

评论

0赞 Dávid Pásztor 11/8/2023
“但是,如果我想替换类、结构、协议名称声明怎么办?一般来说,Swift Macro 可以吗?请更具体地说明您要实现的目标是什么?通过示例显示要应用宏的代码,然后显示希望宏生成的代码,这也将有助于读者了解您的需求。
0赞 Alexander 11/9/2023
你能再澄清一下你的用例吗?在我看来,你只是在寻找.typealias
7赞 rayaantaneja 11/9/2023
宏不可能替换任何东西。Swift 宏纯粹是累加的。但是,您可以让一个独立的宏对某些内容进行计算,但不能就地直接修改现有代码。
1赞 tomerpacific 11/9/2023
@Gargo - 评论内容为:这有帮助吗?这不是您正在寻找的解决方案。通常,当有人试图提供帮助时,习惯上会表现出一点感激之情。另外,我不知道你读了什么,没读了什么。显然,从评论中可以看出,缺少信息。
1赞 Dávid Pásztor 11/9/2023
@Gargo这似乎是一个 XY 问题。为什么要在声明级别将一个类型名称替换为另一个类型名称?为什么声明而不是 ?似乎您希望 Swift 宏像 C 宏一样工作,从字面上看,它只是用一些其他代码替换一些代码。这不是 Swift 宏的工作方式。正如其他人之前所说,Swift 宏纯粹是累加的,它们永远不会取代任何代码。class Someclassclass SomeAnotherClass

答: 暂无答案