Wichtige Punkte
View Protocol ist das zentrale Protokoll von SwiftUI. Es erfordert nur eine Eigenschaft: var body: some View. body ist eine berechnete Eigenschaft, die die UI-Beschreibung zurückgibt. SwiftUI ruft body bei jeder Zustandsänderung auf und rendert das Ergebnis auf der GPU.
@ViewBuilder ist ein Result Builder für Views. Ermöglicht das Schreiben mehrerer Views innerhalb eines Closures ohne return und ohne TupleView. Unterstützt if/else, switch, ForEach. Alle Container (VStack, HStack, ZStack, Group) verwenden @ViewBuilder. Eine Alternative ist Group { … } für Gruppierung ohne Layout. some View ist ein Opaque Type. Der Compiler kennt den konkreten View-Typ (Text, Button, VStack usw.), gibt ihn aber extern als some View zurück. Dies ermöglicht das Ändern des body-Typs ohne Änderung der Signatur. ViewModifier — View-Modifikator: .font(), .padding(), .background(). Benutzerdefinierter Modifikator über ViewModifier-Protokoll und .modifier().
// Beispiel-View mit @ViewBuilder und NavigationStack
struct ContentView: View {
@State private var items = ["Item 1", "Item 2"]
var body: some View {
NavigationStack {
List(items, id: .self) { item in
NavigationLink(item) {
DetailView(item: item)
}
}
.navigationTitle("Items")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Add") {
items.append("New Item")
}
}
}
}
}
}
// DetailView mit @StateObject
struct DetailView: View {
let item: String
@StateObject private var viewModel = DetailViewModel()
var body: some View {
Text(item)
.task {
await viewModel.loadDetails(for: item)
}
}
}NavigationStack (iOS 16+) — datengesteuerte Navigation. Nimmt einen Pfad (Array von hashbaren Werten) entgegen und zeigt das Ziel über navigationDestination an. Ersetzt NavigationLink mit Ziel-Views. NavigationLink — Schaltfläche zum Navigieren im Stack. List — vertikale Liste mit Abschnitten, Swipe-Aktionen, Löschen und Drag & Drop. Form — eine spezialisierte Liste für Einstellungen: Abschnitte, Picker, Toggles, Textfelder. Section — Gruppierung in List/Form mit Kopf- und Fußzeile. ViewModifier — benutzerdefinierte Modifikatoren zur Wiederverwendung von Stilen. .modifier(CustomModifier()) — Anwendung.
List in SwiftUI ist das Äquivalent zu UITableView. Unterstützt .onDelete, .onMove, .refreshable. SwipeActions — .swipeActions { Button("Löschen", role: .destructive) { } }. Form — optimiert für Einstellungen: DatePicker, Toggle, Stepper, Picker. Section mit Header/Footer — zum Gruppieren. OutlineGroup — hierarchische Listen (Äquivalent zu UITableView mit Abschnitten). DisclosureGroup — einklappbarer Abschnitt mit Inhalt. IT Sectr empfiehlt List für Daten und Form für Einstellungen.
PreviewProvider — Protokoll für Vorschauen in Xcode Canvas. Canvas — interaktive SwiftUI-Vorschau (erfordert @main und Swift 5.9+). @ScaledMetric — anpassbare Größe, die mit Dynamic Type skaliert.
Property Wrappers sind die Grundlage der Zustandsverwaltung in SwiftUI. @State — lokaler Zustand (Werttyp). @Binding — Verbindung zum Elternzustand. @StateObject — erstellt ein ObservableObject. SwiftUI verwaltet den Lebenszyklus des Objekts. @ObservedObject — beobachtet ein externes ObservableObject. @EnvironmentObject — Objekt aus der Umgebung (Abhängigkeitsinjektion über .environmentObject()). @Environment — Systemwerte (.colorScheme, .locale). @AppStorage — UserDefaults. @FetchRequest — Core Data Abfrage. @FocusState — Eingabefokus.
| Wrapper | Zweck | Besitz |
|---|---|---|
| @State | Lokaler Zustand (Werttyp) | View besitzt |
| @Binding | Verbindung zum Elternzustand | Elternteil besitzt |
| @StateObject | Erstellt ObservableObject | View besitzt |
| @ObservedObject | Beobachtet externes Objekt | Externer Besitzer |
| @EnvironmentObject | Objekt aus Umgebung | Vorfahre besitzt |
| @Environment | Systemwert | System |
| @AppStorage | UserDefaults | UserDefaults |
| @FocusState | Eingabefokus | View besitzt |
@StateObject vs @ObservedObject: @StateObject erstellt ein Objekt, @ObservedObject beobachtet es. Verwenden Sie @StateObject für die erste Modellerstellung in der Hierarchie, @ObservedObject zur Übergabe an untergeordnete Views. @FocusState — Fokusverwaltung: .focused($field, equals: .email). Unterstützt enum für mehrere Felder.
@Environment — Systemwerte: colorScheme, locale, sizeCategory, layoutDirection, managedObjectContext. Benutzerdefinierte Umgebungswerte (Custom Environment Values) — benutzerdefinierter Wert über EnvironmentKey. Wird zur Abhängigkeitsinjektion verwendet: Dienste ohne explizite Parameter übergeben. .environment()-Modifikator — legt einen Wert in der Hierarchie fest. @EnvironmentObject — ObservableObject von .environmentObject(). Unterscheidet sich von @Environment dadurch, dass es einen Referenztyp übergibt. IT Sectr empfiehlt @Environment für Systemwerte und @EnvironmentObject für Dienste.
.task{} — asynchrone Operation beim Erscheinen der View. Automatischer Abbruch beim Verschwinden. Ersetzt .onAppear für async/await. .onAppear{} — synchrone Operation beim Erscheinen. .onDisappear{} — Operation beim Verschwinden. .onChange(of:) — Reaktion auf Wertänderungen. .onReceive(Publisher) — Reaktion auf Combine-Publisher. View-Lebenszyklus in SwiftUI: init → onAppear → body (Rendering) → onDisappear. Bei Zustandsänderung: body → diff → erneutes Rendern. IT Sectr empfiehlt .task für asynchrones Laden und .onAppear für Analysen.
.animation() — Animationsmodifikator. .transition() — Ein-/Ausblendanimation. withAnimation — explizite Zustandsänderungsanimation. matchedGeometryEffect — Animation zwischen verschiedenen Views (Heldenanimation). PhaseAnimator (iOS 17+) — mehrphasige Animation basierend auf enum. KeyframeAnimator (iOS 17+) — bildweise Animation mit Keyframes. SwiftUI-Animationen werden über Core Animation auf der GPU ausgeführt. IT Sectr empfiehlt .spring() für natürliche Animationen und .interpolatingSpring für physikalische Effekte.
ObservableObject — Protokoll für Objekte mit @Published-Eigenschaften. SwiftUI abonniert den objectWillChange-Publisher. @Published — veröffentlicht Eigenschaftsänderungen. @StateObject — erstellt ObservableObject, verwaltet Lebenszyklus. @ObservedObject — beobachtet extern. Combine — Framework für reaktive Programmierung. @EnvironmentObject — DI über Umgebung. .environmentObject() setzt, @EnvironmentObject liest. MVVM — Standardarchitektur: View (SwiftUI) — ViewModel (ObservableObject) — Model. IT Sectr empfiehlt MVVM + @StateObject für Haupt-ViewModels.
class UserViewModel: ObservableObject {
@Published var users: [User] = []
@Published var isLoading = false
func loadUsers() async {
isLoading = true
defer { isLoading = false }
do {
users = try await api.fetchUsers()
} catch {
print("Fehler: \(error)")
}
}
}
struct UsersView: View {
@StateObject private var viewModel = UserViewModel()
var body: some View {
List(viewModel.users, id: \.id) { user in
Text(user.name)
}
.task { await viewModel.loadUsers() }
.overlay {
if viewModel.isLoading { ProgressView() }
}
}
}Barrierefreiheit in SwiftUI: .accessibilityLabel(), .accessibilityHint(), .accessibilityValue(), .accessibilityAddTraits(). VoiceOver liest Barrierefreiheitsbeschriftungen. Dynamic Type — @ScaledMetric, @DynamicProperty. Lokalisierung: String(localized:) (SwiftUI + String Catalog). LocalizedStringKey — automatische Übersetzung. Pluralregeln — über String Catalog (one, few, many, other). Rechts-nach-Links (Arabisch, Hebräisch) — automatisch unterstützt. .environment(.layoutDirection, .rightToLeft). IT Sectr empfiehlt Barrierefreiheitsbeschriftungen für alle interaktiven Elemente.
struct AccessibleButton: View {
let action: () -> Void
var body: some View {
Button(action: action) {
Label("Settings", systemImage: "gear")
}
.accessibilityLabel("Open Settings")
.accessibilityHint("Double tap to navigate to settings screen")
.accessibilityAddTraits(.isButton)
}
}
// Dynamic Type Unterstützung
struct ScalableText: View {
@ScaledMetric private var fontSize: CGFloat = 17
var body: some View {
Text("Hello, World!")
.font(.system(size: fontSize))
}
}Swift Charts (iOS 16+) — Framework zum Erstellen von Diagrammen. Chart { } — Basiscontainer. BarMark, LineMark, PointMark, AreaMark, RuleMark — Markierungen. ForEach für Daten. ChartAxis — Achsenanpassung. .chartXAxis, .chartYAxis. ChartLegend — Legende. Interpolation — catmullRom, linear, step. Animation — .animation() für Chart. IT Sectr empfiehlt Swift Charts für integrierte Diagramme und Charts (DGCharts) für komplexe.
import Charts
struct MonthlySales: Identifiable {
let id = UUID()
let month: String
let sales: Double
}
struct SalesChart: View {
let data: [MonthlySales]
var body: some View {
Chart(data) { item in
BarMark(
x: .value("Month", item.month),
y: .value("Sales", item.sales)
)
.foregroundStyle(.blue.gradient)
}
.chartXAxisLabel("Month")
.chartYAxisLabel("Sales")
.frame(height: 200)
.padding()
}
}Swift Package Manager (SPM) — Apples Abhängigkeitsverwaltung. In Xcode integriert. Unterstützt: Binärpakete, Ressourcen, Tests, swift-6 strikte Nebenläufigkeit. Paketveröffentlichung über GitHub mit semver-Tag. SPM ist der De-facto-Standard für Swift-Abhängigkeiten und ersetzt CocoaPods und Carthage. IT Sectr empfiehlt SPM für alle neuen Projekte.
Swift Concurrency (async/await, TaskGroup, AsyncSequence) — async/await in Swift 5.5+ integriert. Task — Asynchronitätseinheit. TaskGroup — parallele Aufgaben. AsyncSequence — asynchrone Sequenz (AsyncStream, AsyncAlgorithms). Task Local Values — Kontextdaten für Task. Swift Concurrency ersetzt Combine vollständig für asynchrone Operationen.
Häufig gestellte Fragen
View Protocol ist das Basisprotokoll. Erfordert var body: some View. body ist die auf der GPU gerenderte UI-Beschreibung.
@ViewBuilder ist ein Result Builder für mehrere Views. Ermöglicht if/else, switch, ForEach innerhalb von Containern.
@StateObject erstellt ein Objekt. @ObservedObject beobachtet ein vorhandenes. @StateObject für die erste Erstellung in der Hierarchie.
NavigationStack — datengesteuerte Navigation. pfadbasiert, Deep Linking. Ersetzt NavigationView.
@FocusState — Eingabefokusverwaltung. .focused()-Modifikator. Unterstützt enum für mehrere Felder.
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.