考虑这个类,用宏装饰:
@Blah
final class Foo
{
var title: String = ""
var count: Int = 0
}
在
@Blah
宏的实现中,我想检查每个成员属性的 TypeSyntax
并进行比较。像这样:
static func expansion(of node: AttributeSyntax, providingMembersOf declaration: some DeclGroupSyntax, in context: some MacroExpansionContext) throws -> [DeclSyntax]
{
for member in declaration.memberBlock.members
{
guard let type: TypeSyntax = member.decl.as(VariableDeclSyntax.self)?.bindings.first?.typeAnnotation?.type else {
continue
}
// Pseudo code:
if type.literalStringTokenValue == "String"
{
...
}
else if type.literalStringTokenValue == "Int"
{
...
}
}
}
我知道宏无法处理具有隐含类型的属性声明,但在这种情况下,类型注释is在那里,我只需要它的文字字符串值,以便我可以决定如何继续。
我尝试过使用
.as()
进行转换,但收到了一堆弃用警告。正确的做法是什么?
就是这个:
if type.as(IdentifierTypeSyntax.self)?.name.text == "String"
{
}
我在最初的尝试中只是抓住了错误的语法类型。这个网站对于编写 Swift 宏非常有用,并帮助我发现了错误:https://swift-ast-explorer.com