0Pricing
Swift Academy · Aula

Macros de membros anexadas para reduzir código repetitivo

Gere automaticamente init, CodingKeys ou conformidades com Equatable usando macros de membros.

Macros de membros anexadas para reduzir código repetitivo é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.

Visão geral das macros de membros

Uma macro anexada de membros gera novos membros, como propriedades, métodos e inicializadores, diretamente no tipo anotado.

@AddID
struct User { var name: String }
// After expansion:
// struct User { var name: String; var id = UUID() }

Conformidade com MemberMacro

Implemente MemberMacro e devolva uma matriz de DeclSyntax que represente os novos membros.

import SwiftSyntaxMacros

struct AddIDMacro: MemberMacro {
  static func expansion(
    of node: AttributeSyntax,
    providingMembersOf decl: some DeclGroupSyntax,
    in context: some MacroExpansionContext
  ) throws -> [DeclSyntax] {
    return ["var id = UUID()"]
  }
}

Gerando um inicializador

As macros de membros podem gerar um inicializador personalizado, substituindo o inicializador membro a membro quando necessário.

// Macro expansion returns:
[
  "init(name: String) { self.name = name; self.id = UUID() }"
]

Elementos internos da macro @Observable

O @Observable integrado do Swift usa macros de membros para adicionar infraestrutura de observação à sua classe.

@Observable
class Counter {
  var count = 0
  // macro adds: _$observationRegistrar, access(), withMutation()
}

Lendo o tipo anotado

Acesse as propriedades do tipo anotado por meio do parâmetro decl para gerar membros sensíveis ao contexto.

if let structDecl = decl.as(StructDeclSyntax.self) {
  let members = structDecl.memberBlock.members
  // iterate to inspect stored properties
}

Extraindo propriedades armazenadas

Filtre a lista de membros em busca de declarações de variáveis com padrões de propriedades armazenadas para orientar a geração de código.

let storedProps = members.compactMap { member -> VariableDeclSyntax? in
  guard let varDecl = member.decl.as(VariableDeclSyntax.self),
        varDecl.bindingSpecifier.tokenKind == .keyword(.var)
  else { return nil }
  return varDecl
}

Gerando Equatable a partir dos membros

Uma macro @AutoEquatable pode gerar == comparando cada propriedade armazenada.

// Generated code:
static func == (lhs: User, rhs: User) -> Bool {
  lhs.name == rhs.name && lhs.id == rhs.id
}

Combinando macros de membros e de conformidade

É comum combinar MemberMacro com ConformanceMacro para adicionar membros e declarar a conformidade com o protocolo.

struct AutoEquatableMacro: MemberMacro, ConformanceMacro { ... }

Argumentos do atributo

Sua macro pode aceitar argumentos que personalizam o código gerado.

@Clamped(range: 0...100)
var score: Int = 50
// macro reads range from attribute node and generates clamping accessors

Comunicação de erros da macro

Lance MacroExpansionError ou emita diagnósticos quando a macro for usada incorretamente.

guard decl.is(StructDeclSyntax.self) else {
  throw MacroError.message("@AddID can only be applied to structs")
}

Desempenho da compilação

Como a expansão ocorre em tempo de compilação, as macros de membros não adicionam sobrecarga em tempo de execução, e o código gerado pode ser armazenado em cache.

// All generated members are emitted as source code
// and compiled normally — no reflection at runtime

Verificação rápida

Com qual protocolo uma macro anexada de membros deve estar em conformidade?

Recapitulação da lição

Macros de membros (MemberMacro) geram propriedades armazenadas, propriedades calculadas e inicializadores para o tipo que anotam. Leia os membros existentes do tipo para produzir código sensível ao contexto. Combine-as com ConformanceMacro para também adicionar conformidades de protocolo.

Perguntas Frequentes

A aula “Macros de membros anexadas para reduzir código repetitivo” é grátis?

Sim — o texto completo de “Macros de membros anexadas para reduzir código repetitivo” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.

O que vou aprender em “Macros de membros anexadas para reduzir código repetitivo”?

Gere automaticamente init, CodingKeys ou conformidades com Equatable usando macros de membros. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Macros de membros anexadas para reduzir código repetitivo”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Funções das macros: independentes e anexadas
  2. Como escrever uma macro de expressão independente
  3. Macros de membros anexadas para reduzir código repetitivo
  4. Testes e depuração de macros
← Voltar para Swift Academy