Skriv ett fristående uttrycksmakro
Implementera ett enkelt #stringify-makro med SwiftSyntax och MacroExpansion.
Skriv ett fristående uttrycksmakro är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Swift Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Swift Academy innehåller totalt 4 lektioner.
Projektkonfiguration
Makron finns i ett separat Swift package target av typen .macro och använder SwiftSyntax.
// Package.swift (excerpt)
.macro(
name: "MyMacros",
dependencies: [
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
)Makrodeklaration
Deklarera makrots signatur i ett library target så att klienter kan anropa det.
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
= #externalMacro(module: "MyMacros", type: "StringifyMacro")Implementera makrotypen
Implementera makrot genom att konformera med ExpressionMacro och returnera en 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))"
}
}Registrera pluginet
Skapa en CompilerPlugin som listar alla makron i paketet.
import SwiftCompilerPlugin
@main
struct MyPlugin: CompilerPlugin {
let providingMacros: [Macro.Type] = [
StringifyMacro.self
]
}Använda makrot
Importera makrobiblioteket och anropa makrot med #stringify.
import MyMacros
let (value, source) = #stringify(2 + 3)
print(value) // 5
print(source) // "2 + 3"Konstruktion av ExprSyntax
Returvärden byggs med stränginterpolering i ExprSyntax, vilket utnyttjar SwiftSyntax typkontroll.
// The expansion returns a tuple literal
return "((\(arg)), \(literal: arg.description))"Åtkomst till makroargument
Argument nås via node.arguments, som är en lista med etiketterade uttryck.
let args = node.arguments
for arg in args {
print(arg.label?.text ?? "_", arg.expression)
}Generera diagnostik
Generera kompilatorvarningar eller fel från makron med hjälp av expansionskontexten.
context.diagnose(Diagnostic(
node: node,
message: MyDiagnostic.missingArgument
))SwiftSyntax-syntaxnoder
SwiftSyntax representerar varje språkkonstruktion som en typad syntaxnod som ni kan inspektera och konstruera.
import SwiftSyntax
let expr: ExprSyntax = "1 + 2"
print(type(of: expr)) // BinaryOperatorExprSyntaxMakrohygien
Swift-makron är hygieniska som standard: genererade namn krockar inte med namn i det anropande omfånget.
// Macro-generated variables get unique names internally
// preventing accidental shadowing in user codeExpandera i Xcode
Högerklicka på valfritt makroanrop i Xcode och välj Expandera makro för att granska den genererade källkoden.
#stringify(40 + 2)
// Xcode expands to: (40 + 2, "40 + 2")Snabbkontroll
Vilket protokoll måste en implementation av ett uttrycksmakro konformera med?
Lektionssammanfattning
Skriv ett fristående uttrycksmakro genom att deklarera det med @freestanding(expression), implementera ExpressionMacro i ett .macro-target, registrera det via CompilerPlugin och anropa det med #macroName().
Lär dig Swift med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 122
- Lektioner
- 409
Vanliga frågor
Är lektionen ”Skriv ett fristående uttrycksmakro” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Skriv ett fristående uttrycksmakro”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Swift Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Skriv ett fristående uttrycksmakro”?
Implementera ett enkelt #stringify-makro med SwiftSyntax och MacroExpansion. Ni övar på Swift Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Swift Academy?
Du behöver inga förkunskaper. Utbildningen i Swift Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Skriv ett fristående uttrycksmakro”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Swift Academy-lektionen?
Ja. Varje Swift Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Makroroller: fristående kontra bundna
- Skriv ett fristående uttrycksmakro
- Bundna medlemsmakron för mindre boilerplate
- Testa och felsöka makron