Swift Academy · Lekcja

Pisanie niezależnego makra wyrażeń

Implementowanie prostego makra #stringify za pomocą SwiftSyntax i MacroExpansion.

Lekcja 2 z 413 kroki

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

Higiena 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 code

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

Bezpłatny start

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

  1. Role makr: freestanding a attached
  2. Pisanie niezależnego makra wyrażeń
  3. Dołączane makra składowych do ograniczania kodu szablonowego
  4. Testowanie i debugowanie makr
← Powrót do Swift Academy