Swift Academy · Lektion

Skriv ett fristående uttrycksmakro

Implementera ett enkelt #stringify-makro med SwiftSyntax och MacroExpansion.

Lektion 2 av 413 steg

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)) // BinaryOperatorExprSyntax

Makrohygien

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 code

Expandera 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().

Gratis att börja

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

  1. Makroroller: fristående kontra bundna
  2. Skriv ett fristående uttrycksmakro
  3. Bundna medlemsmakron för mindre boilerplate
  4. Testa och felsöka makron
← Tillbaka till Swift Academy