Scrivere una macro di espressione freestanding
Implementare una semplice macro #stringify con SwiftSyntax e MacroExpansion.
Scrivere una macro di espressione freestanding è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 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.
Configurazione del progetto
Le macro risiedono in un target di un pacchetto Swift separato, di tipo .macro, e usano SwiftSyntax.
// Package.swift (excerpt)
.macro(
name: "MyMacros",
dependencies: [
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
)Dichiarazione della macro
Dichiari la firma della macro in un target libreria, così i client possono chiamarla.
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
= #externalMacro(module: "MyMacros", type: "StringifyMacro")Implementare il tipo macro
Implementi la macro conformandola a ExpressionMacro e restituendo un ExprSyntax.
import SwiftSyntaxMacros
import SwiftSyntax
struct StringifyMacro: ExpressionMacro {
static func expansion(
of node: some FreestandingMacroExpansionSyntax,
in context: some MacroExpansionContext
) throws -> ExprSyntax {
guard let arg = node.arguments.first?.expression else {
throw MacroError.message("Need an argument")
}
return "(\(arg), \(literal: arg.description))"
}
}Registrare il plugin
Crei un CompilerPlugin che elenchi tutte le macro del pacchetto.
import SwiftCompilerPlugin
@main
struct MyPlugin: CompilerPlugin {
let providingMacros: [Macro.Type] = [
StringifyMacro.self
]
}Usare la macro
Importi la libreria della macro e la richiami con #stringify.
import MyMacros
let (value, source) = #stringify(2 + 3)
print(value) // 5
print(source) // "2 + 3"Costruzione di ExprSyntax
I valori restituiti vengono costruiti usando l'interpolazione di stringhe su ExprSyntax, sfruttando la sicurezza dei tipi di SwiftSyntax.
// The expansion returns a tuple literal
return "((\(arg)), \(literal: arg.description))"Accedere agli argomenti della macro
Gli argomenti sono accessibili tramite node.arguments, che è un elenco di espressioni con label.
let args = node.arguments
for arg in args {
print(arg.label?.text ?? "_", arg.expression)
}Generare diagnostica
Emetta avvisi o errori del compilatore dalle macro usando il contesto di espansione.
context.diagnose(Diagnostic(
node: node,
message: MyDiagnostic.missingArgument
))Nodi di sintassi di SwiftSyntax
SwiftSyntax rappresenta ogni costrutto del linguaggio come un nodo di sintassi tipizzato, che può essere analizzato e costruito.
import SwiftSyntax
let expr: ExprSyntax = "1 + 2"
print(type(of: expr)) // BinaryOperatorExprSyntaxHygiene delle macro
Le macro Swift sono hygienic per impostazione predefinita: i nomi generati non entreranno in conflitto con i nomi nell'ambito chiamante.
// Macro-generated variables get unique names internally
// preventing accidental shadowing in user codeEspandere le macro in Xcode
Faccia clic con il pulsante destro del mouse su una chiamata di macro in Xcode e scelga Expand Macro per analizzare il codice sorgente generato.
#stringify(40 + 2)
// Xcode expands to: (40 + 2, "40 + 2")Verifica rapida
A quale protocollo deve conformarsi l'implementazione di una macro di espressione?
Riepilogo della lezione
Scriva una macro di espressione freestanding: la dichiari con @freestanding(expression), implementi ExpressionMacro in un target .macro, la registri tramite CompilerPlugin e la richiami con #macroName().
Impara Swift con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 122
- Lezioni
- 409
Domande Frequenti
La lezione «Scrivere una macro di espressione freestanding» è gratuita?
Sì — il testo completo di «Scrivere una macro di espressione freestanding» è 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 «Scrivere una macro di espressione freestanding»?
Implementare una semplice macro #stringify con SwiftSyntax e MacroExpansion. 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 2 di 4.
Quanto tempo richiede la lezione «Scrivere una macro di espressione freestanding»?
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