Pisanie niezależnego makra wyrażeń
Implementowanie prostego makra #stringify za pomocą SwiftSyntax i MacroExpansion.
Pisanie niezależnego makra wyrażeń to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Konfiguracja projektu
Makra znajdują się w osobnym targetcie pakietu Swift typu .macro, który korzysta z SwiftSyntax.
// Package.swift (excerpt)
.macro(
name: "MyMacros",
dependencies: [
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
)Deklaracja makra
Sygnaturę makra należy zadeklarować w targetcie biblioteki, aby klienci mogli je wywoływać.
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String)
= #externalMacro(module: "MyMacros", type: "StringifyMacro")Implementowanie typu makra
Makro należy zaimplementować, zapewniając zgodność z ExpressionMacro i zwracając wartość 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))"
}
}Rejestrowanie pluginu
Należy utworzyć element CompilerPlugin, który zawiera listę wszystkich makr w pakiecie.
import SwiftCompilerPlugin
@main
struct MyPlugin: CompilerPlugin {
let providingMacros: [Macro.Type] = [
StringifyMacro.self
]
}Używanie makra
Należy zaimportować bibliotekę makra i wywołać je za pomocą #stringify.
import MyMacros
let (value, source) = #stringify(2 + 3)
print(value) // 5
print(source) // "2 + 3"Tworzenie ExprSyntax
Wartości zwracane są tworzone za pomocą interpolacji ciągów znaków w ExprSyntax, co wykorzystuje bezpieczeństwo typów zapewniane przez SwiftSyntax.
// The expansion returns a tuple literal
return "((\(arg)), \(literal: arg.description))"Uzyskiwanie dostępu do argumentów makra
Do argumentów można uzyskać dostęp za pośrednictwem node.arguments, który jest listą wyrażeń z etykietami.
let args = node.arguments
for arg in args {
print(arg.label?.text ?? "_", arg.expression)
}Generowanie diagnostyki
Makra mogą zgłaszać ostrzeżenia lub błędy kompilatora za pośrednictwem kontekstu rozwijania.
context.diagnose(Diagnostic(
node: node,
message: MyDiagnostic.missingArgument
))Węzły składniowe SwiftSyntax
SwiftSyntax reprezentuje każdą konstrukcję języka jako typowany węzeł składniowy, który można analizować i tworzyć.
import SwiftSyntax
let expr: ExprSyntax = "1 + 2"
print(type(of: expr)) // BinaryOperatorExprSyntaxHigiena makr
Makra Swift są domyślnie higieniczne: generowane nazwy nie będą kolidować z nazwami w zakresie wywołującego kodu.
// Macro-generated variables get unique names internally
// preventing accidental shadowing in user codeRozwijanie makr w Xcode
Kliknij prawym przyciskiem myszy dowolne wywołanie makra w Xcode i wybierz Expand Macro, aby wyświetlić wygenerowany kod źródłowy.
#stringify(40 + 2)
// Xcode expands to: (40 + 2, "40 + 2")Szybkie sprawdzenie
Z jakim protokołem musi być zgodna implementacja makra wyrażenia?
Podsumowanie lekcji
Wolnostojące makro wyrażenia tworzy się przez zadeklarowanie go za pomocą @freestanding(expression), zaimplementowanie ExpressionMacro w targetcie .macro, zarejestrowanie go przez CompilerPlugin i wywołanie za pomocą #macroName().
Ucz się Swift dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 122
- Lekcje
- 409
Często zadawane pytania
Czy lekcja „Pisanie niezależnego makra wyrażeń” jest bezpłatna?
Tak — pełny tekst „Pisanie niezależnego makra wyrażeń” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Pisanie niezależnego makra wyrażeń”?
Implementowanie prostego makra #stringify za pomocą SwiftSyntax i MacroExpansion. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Pisanie niezależnego makra wyrażeń”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Role makr: freestanding a attached
- Pisanie niezależnego makra wyrażeń
- Dołączane makra składowych do ograniczania kodu szablonowego
- Testowanie i debugowanie makr