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 accessorsSegnalazione 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 runtimeVerifica 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
- Ruoli delle macro: freestanding e attached
- Scrivere una macro di espressione freestanding
- Macro attached member per ridurre il boilerplate
- Test e debug delle macro