0Pricing
Swift Academy · Lezione

Macro attached member per ridurre il boilerplate

Generare automaticamente init, CodingKeys o conformità a Equatable con le member macro.

Macro attached member per ridurre il boilerplate è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Panoramica delle macro member

Una macro member attached genera nuovi member, come proprietà, metodi e init, direttamente sul tipo decorato.

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

Conformarsi a MemberMacro

Implementi MemberMacro e restituisca un array di DeclSyntax che rappresenta i nuovi member.

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()"]
  }
}

Generare un init

Le macro member possono generare un inizializzatore personalizzato, sostituendo quando necessario l'init memberwise.

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

Internals della macro @Observable

La macro integrata @Observable di Swift usa macro member per aggiungere l'infrastruttura necessaria all'osservazione della classe.

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

Leggere il tipo decorato

Acceda alle proprietà del tipo decorato tramite il parametro decl per generare member sensibili al contesto.

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

Estrarre le proprietà stored

Filtri l'elenco dei member per trovare le dichiarazioni di variabili con pattern di proprietà stored, così da guidare la generazione del codice.

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
}

Generare Equatable dai member

Una macro @AutoEquatable può generare == confrontando ogni proprietà stored.

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

Combinare macro member e conformance

Spesso si combinano MemberMacro e ConformanceMacro per aggiungere member e dichiarare la conformità al protocollo.

struct AutoEquatableMacro: MemberMacro, ConformanceMacro { ... }

Argomenti dell'attributo

La macro può accettare argomenti che personalizzano il codice generato.

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

Segnalazione degli errori delle macro

Lanci MacroExpansionError o emetta diagnostica quando la macro viene usata in modo errato.

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

Prestazioni della compilazione

Poiché l'espansione avviene in fase di compilazione, le macro member non aggiungono alcun overhead a runtime e il codice generato può essere memorizzato nella cache.

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

Verifica rapida

A quale protocollo deve conformarsi una macro member attached?

Riepilogo della lezione

Le macro member (MemberMacro) generano proprietà stored, proprietà computed e inizializzatori per il tipo che decorano. Legga i member esistenti del tipo per produrre codice sensibile al contesto. Le combini con ConformanceMacro per aggiungere anche conformità ai protocolli.

Domande Frequenti

La lezione «Macro attached member per ridurre il boilerplate» è gratuita?

Sì — il testo completo di «Macro attached member per ridurre il boilerplate» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Macro attached member per ridurre il boilerplate»?

Generare automaticamente init, CodingKeys o conformità a Equatable con le member macro. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Macro attached member per ridurre il boilerplate»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Ruoli delle macro: freestanding e attached
  2. Scrivere una macro di espressione freestanding
  3. Macro attached member per ridurre il boilerplate
  4. Test e debug delle macro
← Torna a Swift Academy