SwiftUI ist ein deklaratives Framework von Apple zum Erstellen von Benutzeroberflächen auf allen Plattformen des Ökosystems. Anstatt Schritte imperativ zu beschreiben, deklariert der Entwickler, wie die Oberfläche aussehen soll, und SwiftUI übernimmt deren Darstellung und Aktualisierung. Laut der Apple Developer Documentation (2025) unterstützt SwiftUI iOS 15+, iPadOS 15+, macOS 12+, watchOS 8+ und tvOS 15+ und verwendet das View Protocol als grundlegenden Baustein für alle Oberflächenkomponenten.
Wichtige Erkenntnisse
body-Eigenschaft ist die Grundlage jeder SwiftUI-UI-Komponente und gibt eine Bildschirmbeschreibung durch View-Komposition zurück.SwiftUI ist ein deklaratives Framework, das Apple 2019 eingeführt hat, um UIKit in neuen Projekten zu ersetzen. Anstatt manuell UIView-Instanzen zu erstellen und sie zur Hierarchie hinzuzufügen, beschreibt der Entwickler die Oberfläche durch Strukturen, die dem View-Protokoll entsprechen. SwiftUI berechnet automatisch den Unterschied zwischen dem aktuellen und dem neuen Zustand und zeichnet nur die geänderten Teile mit seiner eigenen Rendering-Engine neu.
Das Framework ist in Swift unter Verwendung von Value Semantics (Strukturen, keine Klassen) geschrieben, was UI-Komponenten leichtgewichtig und threadsicher macht. Im Gegensatz zu UIKit, wo UIViewController aufgrund der Objective-C-Laufzeit 200+ Bytes wiegen kann, ist eine SwiftUI View einfach eine Struktur von wenigen Bytes. Dies ist besonders wichtig für watchOS mit seinem begrenzten Speicher.
Dieselbe View-Beschreibung funktioniert auf iPhone, iPad, Mac, Apple Watch, Apple TV und Apple Vision Pro. SwiftUI passt die Oberfläche an die Plattform an: Touch-Gesten auf iOS, Tastaturkombinationen auf macOS, Digital Crown-Scrolling auf watchOS. Dies verkürzt die Entwicklungszeit für Unternehmen, die Apps auf mehreren Apple-Plattformen veröffentlichen, erfordert aber zusätzliche Konfiguration für plattformspezifische Elemente.
In SwiftUI ist jeder Bildschirm eine Struktur, die das View-Protokoll mit einer einzigen Anforderung implementiert: einer berechneten Eigenschaft body vom Typ some View. Das Schlüsselwort some (opaque type) verbirgt den konkreten View-Typ und ermöglicht SwiftUI, das Rendering zu optimieren. Innerhalb von body kombiniert der Entwickler vorgefertigte Komponenten — Text, Image, Button, List — mit ViewBuilder, der mehrere Views zu einem zusammenfügt.
struct GreetingView: View {
let name: String
var var body: some View {
VStack {
Text("Hallo, \(name)!")
.font(.title)
.foregroundColor(.blue)
Image(systemName: "hand.wave")
.imageScale(.large)
}
.padding()
}
}
Im Beispiel enthält VStack (vertikaler Stack) Text und Image. Der Wert von name wird über den Initialisierer der Struktur übergeben — so funktioniert DI (Dependency Injection) in SwiftUI ohne externe DI-Container. Jeder Modifikator gibt eine neue View mit der angewendeten Änderung zurück, ohne das Original zu verändern. Dies ist dank der Unveränderlichkeit von Werttypen möglich.
ViewBuilder ist ein Result Builder, annotiert mit @resultBuilder, der bis zu 10 Views zu einem zusammenfügt. Innerhalb von body können if/else, switch und ForEach ohne zusätzliche Wrapper verwendet werden. ForEach arbeitet mit Identifiable-Elementen — jeder View wird eine eindeutige ID für korrekte Animation beim Einfügen/Löschen zugewiesen.
In SwiftUI bestimmt der Zustand, welcher Inhalt auf dem Bildschirm angezeigt wird. Wenn sich der Zustand ändert, erstellt SwiftUI den Body der abhängigen View neu und vergleicht das Ergebnis mit dem vorherigen mithilfe eines Diff-Algorithmus. Zur Speicherung des Zustands werden Property Wrapper verwendet — jeder löst seine spezifische Aufgabe: lokaler Zustand, Verbindung mit einer Child-View oder externes Datenmodell.
struct CounterView: View {
@State private var count = 0
var var body: some View {
VStack {
Text("Zähler: \(count)")
Button("Erhöhen") {
count += 1
}
}
}
}
class UserViewModel: ObservableObject {
@Published var name = ""
@Published var age = 0
}
@State speichert einen lokalen einfachen Wert (Int, String, Bool) innerhalb der View-Struktur. SwiftUI verschiebt den Speicher aus der Struktur in einen separaten Speicher — daher kann eine Eigenschaft mit @State mutiert werden, selbst wenn View ein Werttyp ist. @ObservableObject ist für Klassen mit @Published-Eigenschaften, deren Änderungen SwiftUI automatisch über die Notwendigkeit einer Neuzeichnung informieren.
@Binding erstellt eine bidirektionale Verbindung zu einer Datenquelle in der Eltern-View. Der Elternteil übergibt $variable (projizierter Wert), und das Kind liest und schreibt den Wert über das Binding. Dies ermöglicht, Texteingabe oder einen Schalter in eine separate Komponente auszulagern, während der Zustand im Elternteil erhalten bleibt. Ohne @Binding würde jede Änderung einen Callback-Closure erfordern, um den neuen Wert nach oben zu reichen.
Vor iOS 16 wurde die Navigation in SwiftUI auf NavigationView aufgebaut — einer veralteten API mit komplexem Verhalten auf iPad (Split View, Doppelspalte). Ab iOS 16 empfiehlt Apple NavigationStack — eine vereinfachte Alternative mit typsicheren Routen. Der Entwickler definiert einen Enum möglicher Routen, und NavigationStack verwaltet automatisch den Bildschirmstapel mit Unterstützung für Deep Links und Rückkehr zur Wurzel.
enum Route: Hashable {
case detail(id: Int)
case settings
}
struct ContentView: View {
var var body: some View {
NavigationStack {
List {
NavigationLink("Detailbildschirm",
value: Route.detail(id: 42))
NavigationLink("Einstellungen",
value: Route.settings)
}
.navigationDestination(for: Route.self) { route in
switch route {
case .detail(let id): DetailView(id: id)
case .settings: SettingsView()
}
}
}
}
}
Routen, die Hashable entsprechen, erlauben die Verwendung beliebiger Datentypen zum Übergeben von Parametern. navigationDestination(for:destination:) verknüpft den Routentyp mit der Ziel-View. Der Vorteil gegenüber der UIKit-Navigation: Beim Hinzufügen einer neuen Route ist keine Neuzeichnung erforderlich — einfach einen Case zum Enum und einen Handler zum Switch hinzufügen. Deep Links werden über processDeepLink auf NavigationStack behandelt.
Für programmatische Navigation (nach Login, Timer oder Serverantwort) wird @State mit dem NavigationLink-Initialisierer verwendet: NavigationLink(isActive: $isActive). Bei isActive = true erfolgt der Übergang ohne Benutzerberührung. Eine Alternative ist das Binden des $path-Arrays in NavigationStack: $path.append(Route.detail(id: 1)).
Modifier ist eine Methode, die eine modifizierte Kopie der View zurückgibt. Im Gegensatz zu UIKit, wo die Eigenschaftskonfiguration durch Mutation einer bestehenden View erfolgt, erstellt SwiftUI einen neuen Wert mit der angewendeten Änderung. Die Modifikatorverkettung baut die endgültige Oberfläche aus sequenziellen Transformationen auf: Schriftart → Abstand → Farbe → Schatten → Geste.
Apple bietet über 200 integrierte Modifikatoren. Die häufigsten: .font(), .foregroundColor(), .padding(), .background(), .cornerRadius(), .shadow(), .opacity(), .offset(). Die Reihenfolge der Modifikatoren ist wichtig: .padding() vor .background() füllt den Bereich mit Abstand, danach — nur den inneren Bereich. Benutzerdefinierte Modifikatoren werden über das ViewModifier-Protokoll erstellt.
Modifikatoren können bedingt über den ternären Operator angewendet werden: .foregroundColor(isError ? .red : .primary). Für Animation wird .animation(.easeInOut, value: state) verwendet — der Animationsmodifikator wird an eine bestimmte Zustandseigenschaft gebunden. Wenn sich diese Eigenschaft ändert, animiert SwiftUI den Übergang zwischen dem alten und neuen Wert. Animation funktioniert mit opacity, offset, scale, rotation, Größe und Farbe — jede Eigenschaft hat einen entsprechenden AnimatableParameter.
Für benutzerdefinierte Animationen stehen .transition (Erscheinen/Verschwinden) und .matchedGeometryEffect (sanfter Übergang eines Elements zwischen zwei Containern) zur Verfügung. Letzteres wird für Hero-Animationen in Listen verwendet: Ein Symbol in einer Listenzeile verwandelt sich sanft in ein großes Bild auf dem Detailbildschirm.
Die Wahl zwischen SwiftUI und UIKit ist eines der ersten Dilemmata eines iOS-Entwicklers. Beide Frameworks werden von Apple unterstützt, lösen das Problem der Oberflächenerstellung jedoch grundlegend unterschiedlich: SwiftUI deklarativ, UIKit imperativ. Der Unterschied zeigt sich in der Zustandsverwaltung, Navigation, Leistung und Kompatibilität.
| Aspekt | SwiftUI | UIKit |
|---|---|---|
| Ansatz | Deklarativ: was anzeigen | Imperativ: wie erstellen |
| Zustand | Property Wrappers, automatische Neuzeichnung | Manuell: reloadData, setNeedsLayout |
| UI-Code | Kompakt, Modifikatorketten | Ausführlich, NSCoder/Storyboard/Einschränkungen |
| Leistung | Hoch auf iOS 17+, Diff-Algorithmus | Spitze auf iOS 12–16, direkte Kontrolle |
| Mindestversion | iOS 15+ (volle Unterstützung) | iOS 2+ (alle Versionen) |
Für neue Projekte mit Mindestversion iOS 17 empfiehlt Apple SwiftUI als primäres Framework. UIKit bleibt notwendig für Oberflächen, die feine Kontrolle über das Rendering erfordern (benutzerdefiniertes UICollectionViewLayout, komplexe CAAnimation-Szenen) oder Unterstützung für iOS 12–14. Viele Projekte verwenden einen hybriden Ansatz: SwiftUI wird über UIHostingController in eine UIKit-App eingebettet, und UIViewRepresentable ermöglicht die Verwendung von UIKit-Komponenten innerhalb der SwiftUI-Hierarchie.
Häufig gestellte Fragen
Ja, über UIHostingController (SwiftUI in UIKit) und UIViewRepresentable (UIKit in SwiftUI). Dies ist ein hybrider Ansatz, der bei der Migration beliebt ist.
iOS 17 bietet volle Funktionalität: NavigationStack, Observation Framework, Swift Charts. iOS 15 ist die Mindestschwelle für die Produktion.
Der häufigste Grund ist das Ändern einer @Published-Eigenschaft in einem Hintergrundthread. ObservableObject muss Änderungen auf dem Main Actor senden: @MainActor class ViewModel.
Verwenden Sie .debounce über Combine: Button.publisher(for: .tap) .debounce(for: .seconds(0.3), scheduler: RunLoop.main).
Ja, über Gesture-Modifikatoren: DragGesture, LongPressGesture, MagnificationGesture, RotationGesture. Kombinieren Sie sie mit .simultaneousGesture() und .sequenced().
Zusammenfassung
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.
Lesen Sie auch