Swift Academy · Lektion

Attached-Member-Makros zur Reduzierung von Boilerplate

Generieren Sie init, CodingKeys oder Equatable-Konformitäten automatisch mit Member-Makros.

Lektion 3 von 413 Schritte

Attached-Member-Makros zur Reduzierung von Boilerplate ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Überblick über Member-Makros

Ein angehängtes Member-Makro erzeugt neue Member wie Eigenschaften, Methoden und Inits direkt am dekorierten Typ.

@AddID
struct User { var name: String }
// After expansion:
// struct User { var name: String; var id = UUID() }

MemberMacro konform machen

Implementieren Sie MemberMacro und geben Sie ein Array aus DeclSyntax zurück, das die neuen Member darstellt.

import SwiftSyntaxMacros

struct AddIDMacro: MemberMacro {
  static func expansion(
    of node: AttributeSyntax,
    providingMembersOf decl: some DeclGroupSyntax,
    in context: some MacroExpansionContext
  ) throws -> [DeclSyntax] {
    return ["var id = UUID()"]
  }
}

Einen Init erzeugen

Member-Makros können einen benutzerdefinierten Initializer erzeugen und bei Bedarf den Memberwise-Init ersetzen.

// Macro expansion returns:
[
  "init(name: String) { self.name = name; self.id = UUID() }"
]

Interna des @Observable-Makros

Das integrierte @Observable-Makro von Swift verwendet Member-Makros, um Ihrer Klasse die Infrastruktur für Beobachtung hinzuzufügen.

@Observable
class Counter {
  var count = 0
  // macro adds: _$observationRegistrar, access(), withMutation()
}

Den dekorierten Typ auslesen

Greifen Sie über den Parameter decl auf die Eigenschaften des dekorierten Typs zu, um kontextabhängige Member zu erzeugen.

if let structDecl = decl.as(StructDeclSyntax.self) {
  let members = structDecl.memberBlock.members
  // iterate to inspect stored properties
}

Gespeicherte Eigenschaften extrahieren

Filtern Sie die Memberliste nach Variablendeklarationen mit Mustern für gespeicherte Eigenschaften, um die Codegenerierung zu steuern.

let storedProps = members.compactMap { member -> VariableDeclSyntax? in
  guard let varDecl = member.decl.as(VariableDeclSyntax.self),
        varDecl.bindingSpecifier.tokenKind == .keyword(.var)
  else { return nil }
  return varDecl
}

Equatable aus Membern erzeugen

Ein @AutoEquatable-Makro kann == erzeugen, indem es jede gespeicherte Eigenschaft vergleicht.

// Generated code:
static func == (lhs: User, rhs: User) -> Bool {
  lhs.name == rhs.name && lhs.id == rhs.id
}

Member- und Conformance-Makros kombinieren

Häufig kombinieren Sie MemberMacro mit ConformanceMacro, um sowohl Member hinzuzufügen als auch die Protokollkonformität zu deklarieren.

struct AutoEquatableMacro: MemberMacro, ConformanceMacro { ... }

Argumente von Attributen

Ihr Makro kann Argumente akzeptieren, die den erzeugten Code anpassen.

@Clamped(range: 0...100)
var score: Int = 50
// macro reads range from attribute node and generates clamping accessors

Fehlerberichte von Makros

Werfen Sie MacroExpansionError oder geben Sie Diagnosen aus, wenn das Makro falsch verwendet wird.

guard decl.is(StructDeclSyntax.self) else {
  throw MacroError.message("@AddID can only be applied to structs")
}

Build-Performance

Da die Erweiterung zur Compile-Zeit erfolgt, verursachen Member-Makros keinen Laufzeitaufwand, und der erzeugte Code kann zwischengespeichert werden.

// All generated members are emitted as source code
// and compiled normally — no reflection at runtime

Schnelltest

Welchem Protokoll muss ein angehängtes Member-Makro entsprechen?

Zusammenfassung der Lektion

Member-Makros (MemberMacro) erzeugen gespeicherte und berechnete Eigenschaften sowie Initializer für den Typ, den sie dekorieren. Lesen Sie die vorhandenen Member des Typs aus, um kontextabhängigen Code zu erzeugen. Kombinieren Sie sie mit ConformanceMacro, um zusätzlich Protokollkonformitäten hinzuzufügen.

Kostenlos starten

Lerne Swift mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
122
Lektionen
409

Häufig gestellte Fragen

Ist die Lektion „Attached-Member-Makros zur Reduzierung von Boilerplate“ kostenlos?

Ja — der vollständige Text von „Attached-Member-Makros zur Reduzierung von Boilerplate“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Attached-Member-Makros zur Reduzierung von Boilerplate“?

Generieren Sie init, CodingKeys oder Equatable-Konformitäten automatisch mit Member-Makros. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Attached-Member-Makros zur Reduzierung von Boilerplate“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Makrorollen: Freestanding vs. Attached
  2. Ein freistehendes Expression-Makro schreiben
  3. Attached-Member-Makros zur Reduzierung von Boilerplate
  4. Makros testen und debuggen
← Zurück zu Swift Academy