SwiftUI v mobilním vývoji: co to je, klíčové pojmy a jak funguje

Autor: IT Sectr Publikováno: 2026-07-02 Doba čtení: 10 min
SwiftUI je deklarativní framework Apple pro vytváření rozhraní na všech platformách. Podle Apple SwiftUI Docs (2025) se SwiftUI používá v 70 % nových aplikací v App Store. Porozumění klíčovým pojmům SwiftUI — View Protocol, @ViewBuilder, NavigationStack — je základem moderního iOS vývoje.

Hlavní body

  • View Protocol — var body: some View. Každý View je struktura vyhovující protokolu View. body je popis UI.
  • @ViewBuilder — Result Builder pro více Views v kontejnerech. if/else, switch, ForEach uvnitř body.
  • NavigationStack (iOS 16+) — navigace řízená daty. path-based, deep linking. Nahrazuje NavigationView.
  • @StateObject — vlastnictví objektu. @ObservedObject — pozorování. @EnvironmentObject — prostředí.
  • @FocusState — správa zaměření. .task{}, .onAppear{} — životní cyklus. PreviewProvider — náhled.

Základy (View Protocol, body, some View, @ViewBuilder)

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

@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().

swift
// 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)
            }
    }
}

Modifikátory a kontejnery (ViewModifier, NavigationStack, List, Form)

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 a Form podrobně

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.

Správa stavu (@StateObject, @ObservedObject, @EnvironmentObject, @FocusState)

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í
@StateLokální stav (typ hodnoty)View vlastní
@BindingSpojení se stavem rodičeRodič vlastní
@StateObjectVytváří ObservableObjectView vlastní
@ObservedObjectPozoruje externí objektExterní vlastník
@EnvironmentObjectObjekt z prostředíPředek vlastní
@EnvironmentSystémová hodnotaSystém
@AppStorageUserDefaultsUserDefaults
@FocusStateZaměření vstupuView 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í.

Hodnoty prostředí a DI

@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.

Životní cyklus (.task, .onAppear, .onDisappear)

.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.

Animace ve SwiftUI

.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.

Tok dat (Bindings, @Published, ObservableObject)

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.

swift
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 a lokalizace

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.

swift
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))
    }
}

Grafy a vizualizace (Swift Charts)

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é.

swift
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

Co je View Protocol ve SwiftUI?

View Protocol je základní protokol. Vyžaduje var body: some View. body je popis UI vykreslený na GPU.

Co je @ViewBuilder a proč je potřeba?

@ViewBuilder je Result Builder pro více Views. Umožňuje if/else, switch, ForEach v kontejnerech.

Jaký je rozdíl mezi @StateObject a @ObservedObject?

@StateObject vytváří objekt. @ObservedObject pozoruje existující. @StateObject pro první vytvoření v hierarchii.

Co je NavigationStack v iOS 16+?

NavigationStack — navigace řízená daty. path-based, deep linking. Nahrazuje NavigationView.

Jak funguje @FocusState ve SwiftUI?

@FocusState — správa zaměření vstupu. Modifikátor .focused(). Podporuje enum pro více polí.

Souhrn

  • View Protocol — var body: some View. Základ SwiftUI. Každý View je struct.
  • @ViewBuilder — deklarativní syntaxe pro více Views. if/else, ForEach uvnitř body.
  • NavigationStack (iOS 16+) — moderní navigace. data-driven, path-based.
  • @StateObject — vlastnictví modelu. @ObservedObject — pozorování. @EnvironmentObject — DI.
  • @FocusState — správa zaměření. Užitečné pro formuláře a více vstupních polí.
  • .task{} — asynchronní operace s automatickým zrušením. .onAppear{} — synchronní.
  • PreviewProvider a Canvas — náhledy v Xcode. @ScaledMetric — adaptivní velikosti.

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í.

Prodiskutovat projekt