Gostaria de definir uma nova macro @publiclyInitiazable
que seja um alias para @MemberwiseInit(.public, _optionalsDefaultNil: true)
este pacote .
Como posso fazer isso facilmente? Eu tentei
@attached(member, names: named(init))
public macro publiclyInitializable(
_ accessLevel: AccessLevelConfig = .public,
_deunderscoreParameters: Bool? = nil,
_optionalsDefaultNil: Bool? = true
) =
#externalMacro(
module: "MemberwiseInitMacros",
type: "MemberwiseInitMacro"
)
mas os parâmetros não são aplicados:
Parece que você quer que a macro tenha argumentos default diferentes. Atualmente, isso não é possível, a menos que você faça um fork da implementação da macro.
A maneira como as macros leem seus argumentos é diferente de como os métodos leem seus argumentos. Em particular, as implementações de macro leem os nós AST do código-fonte diretamente, em vez de avaliar as expressões de argumento como quando você chama um método. Os valores de parâmetro padrão que você vê na declaração da macro não afetam como a macro se expande. Eles servem como documentação, na melhor das hipóteses.
Para que isso funcione corretamente, você precisa escrever sua própria macro que pode expandir para
@MemberwiseInit
. No entanto, a partir do Swift 6.0, esse tipo de macro não é suportado. Você só pode adicionar atributos a membros de uma declaração usando umMemberAttributeMacro
. Na melhor das hipóteses, você precisa de um tipo envolvente, por exemploEsse tipo de fechamento pode ser indesejável, mas você pode usar um
typealias
para superar isso.Alternativamente, você pode bifurcar o repositório e alterar a implementação da macro. É aqui que você precisa alterar.