Hlavní body
View Protocol je ústřední protokol SwiftUI. Vyžaduje pouze jednu vlastnost: var body: some View. body je vypočítaná vlastnost, která vrací popis UI. SwiftUI volá body při každé změně stavu a vykresluje výsledek na GPU.
@ViewBuilder je Result Builder pro Views. Umožňuje psát více Views uvnitř closure bez return a bez TupleView. Podporuje if/else, switch, ForEach. Všechny kontejnery (VStack, HStack, ZStack, Group) používají @ViewBuilder. Alternativou je Group { … } pro seskupení bez rozvržení. some View je Opaque Type. Kompilátor zná konkrétní typ View (Text, Button, VStack atd.), ale externě jej vrací jako some View. To umožňuje změnit typ body bez změny signatury. ViewModifier — modifikátor View: .font(), .padding(), .background(). Vlastní modifikátor přes ViewModifier protocol a .modifier().
// Příklad View s @ViewBuilder a 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 s @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+) — navigace řízená daty. Přijímá cestu (pole hashable hodnot) a zobrazuje cíl přes navigationDestination. Nahrazuje NavigationLink s cílovými zobrazeními. NavigationLink — tlačítko pro navigaci v zásobníku. List — vertikální seznam s sekcemi, přejetími, mazáním a přetahováním. Form — specializovaný List pro nastavení: sekce, výběry, přepínače, textová pole. Section — seskupení v List/Form s hlavičkou a patičkou. ViewModifier — vlastní modifikátory pro opakované použití stylů. .modifier(CustomModifier()) — aplikace.
List ve SwiftUI je ekvivalent UITableView. Podporuje .onDelete, .onMove, .refreshable. SwipeActions — .swipeActions { Button("Smazat", role: .destructive) { } }. Form — optimalizován pro nastavení: DatePicker, Toggle, Stepper, Picker. Section s header/footer — pro seskupení. OutlineGroup — hierarchické seznamy (ekvivalent UITableView s sekcemi). DisclosureGroup — sbalitelná sekce s obsahem. IT Sectr doporučuje List pro data a Form pro nastavení.
PreviewProvider — protokol pro náhledy v Xcode Canvas. Canvas — interaktivní náhled SwiftUI (vyžaduje @main a Swift 5.9+). @ScaledMetric — adaptivní velikost, která seškáluje s Dynamic Type.
Property Wrappers jsou základem správy stavu ve SwiftUI. @State — lokální stav (typ hodnoty). @Binding — spojení se stavem rodiče. @StateObject — vytváří ObservableObject. SwiftUI spravuje životní cyklus objektu. @ObservedObject — pozoruje externí ObservableObject. @EnvironmentObject — objekt z prostředí (vkládání závislostí přes .environmentObject()). @Environment — systémové hodnoty (.colorScheme, .locale). @AppStorage — UserDefaults. @FetchRequest — dotaz Core Data. @FocusState — zaměření vstupu.
| Zabalovač | Účel | Vlastnictví |
|---|---|---|
| @State | Lokální stav (typ hodnoty) | View vlastní |
| @Binding | Spojení se stavem rodiče | Rodič vlastní |
| @StateObject | Vytváří ObservableObject | View vlastní |
| @ObservedObject | Pozoruje externí objekt | Externí vlastník |
| @EnvironmentObject | Objekt z prostředí | Předek vlastní |
| @Environment | Systémová hodnota | Systém |
| @AppStorage | UserDefaults | UserDefaults |
| @FocusState | Zaměření vstupu | View vlastní |
@StateObject vs @ObservedObject: @StateObject vytváří objekt, @ObservedObject jej pozoruje. Použijte @StateObject pro první vytvoření modelu v hierarchii, @ObservedObject pro předání podřízeným zobrazením. @FocusState — správa zaměření: .focused($field, equals: .email). Podporuje enum pro více polí.
@Environment — systémové hodnoty: colorScheme, locale, sizeCategory, layoutDirection, managedObjectContext. Vlastní Environment Values — vlastní hodnota přes EnvironmentKey. Používá se pro vkládání závislostí: předávání služeb bez explicitních parametrů. Modifikátor .environment() — nastavuje hodnotu v hierarchii. @EnvironmentObject — ObservableObject z .environmentObject(). Liší se od @Environment tím, že předává referenční typ. IT Sectr doporučuje @Environment pro systémové hodnoty a @EnvironmentObject pro služby.
.task{} — asynchronní operace při zobrazení pohledu. Automatické zrušení při zmizení. Nahrazuje .onAppear pro async/await. .onAppear{} — synchronní operace při zobrazení. .onDisappear{} — operace při zmizení. .onChange(of:) — reakce na změny hodnoty. .onReceive(Publisher) — reakce na Combine publisher. Životní cyklus View ve SwiftUI: init → onAppear → body (vykreslení) → onDisappear. Při změně stavu: body → diff → nové vykreslení. IT Sectr doporučuje .task pro asynchronní načítání a .onAppear pro analytiku.
.animation() — modifikátor animace. .transition() — animace zobrazení/zmizení. withAnimation — explicitní animace změny stavu. matchedGeometryEffect — animace mezi různými pohledy (hero animation). PhaseAnimator (iOS 17+) — vícerázová animace založená na enum. KeyframeAnimator (iOS 17+) — snímek po snímku s klíčovými snímky. Animace SwiftUI běží na GPU přes Core Animation. IT Sectr doporučuje .spring() pro přirozené animace a .interpolatingSpring pro fyzikální efekty.
ObservableObject — protokol pro objekty s @Published vlastnostmi. SwiftUI se přihlásí k odběru publisheru objectWillChange. @Published — zveřejňuje změny vlastnosti. @StateObject — vytváří ObservableObject, spravuje životní cyklus. @ObservedObject — pozoruje externí. Combine — framework pro reaktivní programování. @EnvironmentObject — DI přes prostředí. .environmentObject() nastavuje, @EnvironmentObject čte. MVVM — standardní architektura: View (SwiftUI) — ViewModel (ObservableObject) — Model. IT Sectr doporučuje MVVM + @StateObject pro hlavní ViewModely.
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("Chyba: \(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() }
}
}
}Přístupnost ve SwiftUI: .accessibilityLabel(), .accessibilityHint(), .accessibilityValue(), .accessibilityAddTraits(). VoiceOver čte popisky přístupnosti. Dynamic Type — @ScaledMetric, @DynamicProperty. Lokalizace: String(localized:) (SwiftUI + String Catalog). LocalizedStringKey — automatický překlad. Pravidla množného čísla — přes String Catalog (one, few, many, other). Zprava doleva (arabština, hebrejština) — automaticky podporováno. .environment(.layoutDirection, .rightToLeft). IT Sectr doporučuje popisky přístupnosti pro všechny interaktivní prvky.
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)
}
}
// Podpora Dynamic Type
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 pro vytváření grafů. Chart { } — základní kontejner. BarMark, LineMark, PointMark, AreaMark, RuleMark — značky. ForEach pro data. ChartAxis — přizpůsobení os. .chartXAxis, .chartYAxis. ChartLegend — legenda. Interpolace — catmullRom, linear, step. Animace — .animation() pro Chart. IT Sectr doporučuje Swift Charts pro vestavěné grafy a Charts (DGCharts) pro složité.
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) — Apple správce závislostí. Integrován do Xcode. Podporuje: binární balíčky, zdroje, testy, swift-6 přísnou souběžnost. Publikování balíčků přes GitHub s semver značkou. SPM je de facto standard pro Swift závislosti, nahrazující CocoaPods a Carthage. IT Sectr doporučuje SPM pro všechny nové projekty.
Swift Concurrency (async/await, TaskGroup, AsyncSequence) — async/await zabudováno do Swift 5.5+. Task — jednotka asynchronnosti. TaskGroup — paralelní úlohy. AsyncSequence — asynchronní sekvence (AsyncStream, AsyncAlgorithms). Task Local Values — kontextová data pro Task. Swift Concurrency zcela nahrazuje Combine pro asynchronní operace.
Často kladené otázky
View Protocol je základní protokol. Vyžaduje var body: some View. body je popis UI vykreslený na GPU.
@ViewBuilder je Result Builder pro více Views. Umožňuje if/else, switch, ForEach v kontejnerech.
@StateObject vytváří objekt. @ObservedObject pozoruje existující. @StateObject pro první vytvoření v hierarchii.
NavigationStack — navigace řízená daty. path-based, deep linking. Nahrazuje NavigationView.
@FocusState — správa zaměření vstupu. Modifikátor .focused(). Podporuje enum pro více polí.
Souhrn
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.