@ViewBuilder: Was ist das, Result Builder für View in SwiftUI

Autor: IT Sectr Veröffentlicht: 2026-06-24 Lesezeit: 7 Min.

@ViewBuilder ist eine Result-Builder-Annotation in SwiftUI, die für den deklarativen Aufbau von View-Hierarchien entwickelt wurde. Laut Apple Developer Documentation, 2024 wandelt @ViewBuilder einen Codeblock mit mehreren Ausdrücken und bedingter Logik in einen einzigen View-Typ um, den der Swift-Compiler verstehen kann. Ohne diese Annotation wäre es unmöglich, die vertraute deklarative SwiftUI-Syntax mit if/else und mehreren Elementen im body zu verwenden.

Wichtige Punkte

  • @ViewBuilder — ein Result Builder, der mehrere Views ohne zusätzliche Container zu einer Komposition zusammenfasst
  • buildBlock — kapselt eine Folge von Ausdrücken in einem TupleView mit bis zu 10 Elementen
  • buildEither — erstellt ConditionalContent für if/else- und switch-Zweige
  • Einschränkung — bis zu 10 Elemente in einem einzelnen Block ohne Group oder ForEach
  • Implizite Anwendung — body ist bereits in @ViewBuilder eingekapselt, benutzerdefinierte Funktionen benötigen explizite Annotation

Was ist @ViewBuilder in SwiftUI?

@ViewBuilder ist eine Annotation, die das Result-Builder-Muster (SE-0289) implementiert und es SwiftUI ermöglicht, mehrere Views mit deklarativer Syntax zu einer einzigen Komposition zusammenzuführen. Sie kapselt automatisch mehrere Ausdrücke, bedingte Konstrukte und optionale Werte in die entsprechenden Typen: TupleView, ConditionalContent, OptionalContent.

Vor der Einführung von Result Buildern mussten Entwickler Elemente manuell in VStack oder HStack kapseln und für bedingte Logik ternäre Operatoren oder Factory-Methoden verwenden. @ViewBuilder machte die SwiftUI-Syntax prägnant und lesbar und ermöglichte das Schreiben von Code, der wie normales Swift mit if/else und Schleifen aussieht.

Laut Swift Evolution SE-0289 sind Result Builder ein allgemeiner Mechanismus, der nicht an SwiftUI gebunden ist. @ViewBuilder ist eine Implementierung dieses Mechanismus, neben @StringBuilder für die String-Konstruktion und Bibliotheksimplementierungen für andere DSLs. In SwiftUI wird @ViewBuilder nicht nur für body verwendet, sondern auch für Closure-Parameter von Containern (VStack, HStack, ZStack, List).

Unterschied zum imperativen Ansatz

Im imperativen UIKit erstellen Sie explizit ein UIView, konfigurieren seine Eigenschaften und fügen es über addSubview zur Hierarchie hinzu. In SwiftUI mit @ViewBuilder beschreiben Sie deklarativ, welche Views angezeigt werden sollen, und SwiftUI übernimmt die Erstellung, Aktualisierung und Entfernung von Elementen basierend auf Zustandsänderungen.

Wie @ViewBuilder funktioniert: Result Builder

Result Builder ist ein Swift-Mechanismus, der eine Folge von Ausdrücken durch die statischen Methoden buildBlock, buildOptional, buildEither und andere in einen einzigen zusammengesetzten Wert umwandelt. Wenn der Compiler die @ViewBuilder-Annotation sieht, wendet er diese Methoden während der Kompilierung automatisch auf den Codeblock an.

swift
@resultBuilder
struct ViewBuilder {
    static func buildBlock<C0, C1>(_ c0: C0, _ c1: C1) -> TupleView<(C0, C1)>
    static func buildIf<C>(_ c: C?) -> C?
    static func buildEither<T, F>(first: T) -> ConditionalContent<T, F>
    static func buildEither<T, F>(second: F) -> ConditionalContent<T, F>
}

buildBlock akzeptiert 1 bis 10 Ausdrücke und gibt einen TupleView zurück. Jede Stelligkeit (Anzahl der Ausdrücke) hat ihre eigene buildBlock-Überladung: von buildBlock bis buildBlock. Aus diesem Grund ist die Anzahl der Elemente in einem einzelnen @ViewBuilder-Block auf 10 begrenzt.

buildEither (first/second) verarbeitet if/else-Konstrukte. Jeder Zweig wird an die entsprechende Methode übergeben, und das Ergebnis wird in ConditionalContent gekapselt — einem Typ, der die spezifischen Zweigtypen verbirgt und eine einheitliche Schnittstelle für SwiftUI bereitstellt.

Implizites Verhalten von @ViewBuilder

In SwiftUI ist die body-Eigenschaft bereits implizit mit @ViewBuilder annotiert — Sie sehen diese Annotation nicht im Code, aber der Compiler wendet sie automatisch an. Für benutzerdefinierte Eigenschaften, die mehrere Views zurückgeben, oder für Closure-Parameter muss die Annotation jedoch explizit angegeben werden.

Einschränkungen von @ViewBuilder und wie man sie umgeht

Einschränkung 1 — 10 Elemente in einem Block. Dies ist die bekannteste Einschränkung von @ViewBuilder. Wenn Sie mehr als 10 Elemente auf derselben Ebene anzeigen müssen, gibt der Compiler einen Fehler aus. Zu den Lösungen gehören Group, ForEach, List oder die Aufteilung in Unterkomponenten. Group fügt keine visuelle Verschachtelung hinzu, aber jede Group zählt als ein Element.

swift
struct ManyElementsView: View {
    var body: some View {
        Group {
            Text("1"); Text("2"); Text("3")
            Text("4"); Text("5"); Text("6")
            Text("7"); Text("8"); Text("9")
        }
        Group {
            Text("10"); Text("11"); Text("12")
        }
    }
}

Einschränkung 2 — Fehlende Unterstützung für bestimmte Konstrukte. @ViewBuilder unterstützt keine do/catch-, guard-, for-in- (ohne ForEach) und andere Kontrollflusskonstrukte. Verwenden Sie für Schleifen ForEach mit identifizierbaren Daten. Für die Fehlerbehandlung verwenden Sie separate Views, die Result oder optionale Werte akzeptieren.

Einschränkung 3 — Debugging-Komplexität. Bei Fehlern in @ViewBuilder erzeugt der Compiler ausführliche Meldungen, in denen die Ursache schwer zu finden ist. Typische Probleme: Typkonflikte in if/else-Zweigen, Überschreitung des 10-Elemente-Limits oder fehlende erforderliche buildBlock-Überladungen.

Verwendungsmuster von @ViewBuilder

Muster 1: Bedingte Anzeige mit if/else. Der häufigste Anwendungsfall für @ViewBuilder. Ermöglicht das Anzeigen verschiedener Views basierend auf dem Zustand ohne Verwendung von ternären Operatoren oder Factory-Methoden.

swift
struct StatusView: View {
    var status: LoadStatus

    @ViewBuilder
    var body: some View {
        switch status {
        case .loading:
            ProgressView("Loading...")
        case .loaded(let data):
            DataView(data: data)
        case .error(let message):
            ErrorView(message: message)
        }
    }
}

Muster 2: @ViewBuilder in Funktions- und Initialisiererparametern. Wird verwendet, um wiederverwendbare Container zu erstellen, die child Views über einen Closure akzeptieren. Dies ist das Standardmuster für Bibliotheken und UI-Komponenten.

swift
struct SectionCard<Content: View>: View {
    let title: String
    @ViewBuilder let content: Content

    var body: some View {
        VStack(alignment: .leading) {
            Text(title).font(.headline)
            content
        }
        .padding()
        .background(Color.gray.opacity(0.1))
        .cornerRadius(12)
    }
}

Muster 3: Komposition mit ForEach. @ViewBuilder arbeitet korrekt mit ForEach zusammen und ermöglicht die dynamische Generierung von Elementen aus einem Datenarray. Jedes ForEach-Element zählt als ein Ausdruck im @ViewBuilder-Kontext.

Erstellen eines benutzerdefinierten ViewBuilder für wiederverwendbare Komponenten

Benutzerdefinierter ViewBuilder ist eine benutzerdefinierte Funktion oder Eigenschaft, die mit @ViewBuilder annotiert ist und some View zurückgibt. Solche Funktionen ermöglichen es, komplexe Anzeigelogik zu kapseln und in verschiedenen Teilen der Anwendung wiederzuverwenden.

swift
struct FormRow<Content: View>: View {
    let label: String
    @ViewBuilder let content: Content

    var body: some View {
        HStack {
            Text(label)
                .frame(width: 120, alignment: .trailing)
            content
        }
    }
}

// Verwendung:
FormRow(label: "Name") {
    TextField("Enter name", text: $name)
}

FormRow(label: "Gender") {
    Picker("Select", selection: $gender) {
        Text("Männlich").tag(Gender.male)
        Text("Weiblich").tag(Gender.female)
    }
}

Wichtige Regel: Eine benutzerdefinierte Funktion mit @ViewBuilder muss some View zurückgeben, nicht einen konkreten Typ oder das View-Protokoll. Nur ein opaker Typ ermöglicht es, die konkrete Implementierung zu verbergen und gleichzeitig die Flexibilität der Komposition zu erhalten.

Leistung: Benutzerdefinierte @ViewBuilder-Funktionen verursachen im Vergleich zu direktem Code im body keinen Overhead. Der Compiler inlineiert Aufrufe und optimiert den resultierenden Code. Die Aufteilung des body in @ViewBuilder-Funktionen verbessert die Lesbarkeit ohne Leistungseinbußen.

Häufig gestellte Fragen

Was ist @ViewBuilder in SwiftUI?

@ViewBuilder ist eine Result-Builder-Annotation, die einen Codeblock mit mehreren Ausdrücken und Bedingungen in einen einzigen View-Typ umwandelt. Sie ermöglicht die Verwendung vertrauter Swift-Syntax (if/else, switch, optionale Ausdrücke) innerhalb der deklarativen UI von SwiftUI.

Warum kann man nicht mehr als 10 Elemente in @ViewBuilder einfügen?

Die Einschränkung ergibt sich aus der Implementierung von buildBlock — für jede Stelligkeit von 1 bis 10 gibt es eine separate Methodenüberladung. Swift unterstützt keine variadischen Generics, daher ist die Anzahl der Überladungen fest. Umgehen können Sie dies mit Group, ForEach oder Unterkomponenten.

Muss ich @ViewBuilder explizit vor body angeben?

Nein, das View-Protokoll wendet implizit @ViewBuilder auf die body-Eigenschaft an. Für benutzerdefinierte Eigenschaften, Methoden und Closure-Parameter, die mehrere Views zurückgeben, muss die Annotation jedoch explizit angegeben werden. Ohne sie kann der Compiler mehrere Ausdrücke nicht verarbeiten.

Wie behandelt @ViewBuilder optionale Ausdrücke?

Für optionale Ausdrücke wird die Methode buildIf verwendet, die einen optionalen View akzeptiert und ihn zurückgibt, wenn ein Wert vorhanden ist. Ist der Wert nil, gibt buildIf nil zurück und das Element wird nicht angezeigt. Dies ermöglicht die Verwendung von if let innerhalb des body.

Kann man @ViewBuilder mit switch verwenden?

Ja, seit Swift 5.9 unterstützt @ViewBuilder switch über die buildExpression-Methode. Der Compiler wandelt jeden case-Zweig in den entsprechenden buildEither-Aufruf um. Die switch-Unterstützung macht den Code im Vergleich zu verschachtelten if/else-Konstrukten lesbarer.

Zusammenfassung

  • @ViewBuilder — ein Result Builder für den deklarativen Aufbau von View-Hierarchien in SwiftUI
  • buildBlock kapselt eine Folge von Ausdrücken in TupleView (bis zu 10 Elemente)
  • buildEither erstellt ConditionalContent für if/else- und switch-Zweige
  • buildIf behandelt optionale Ausdrücke und if ohne else
  • Group und ForEach helfen, das 10-Elemente-Limit pro Block zu umgehen
  • Benutzerdefinierte @ViewBuilder-Funktionen verbessern die Wiederverwendbarkeit ohne Leistungsverlust
  • @ViewBuilder wird implizit auf body angewendet, erfordert jedoch explizite Annotation für Parameter

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch