Какие способы навигации доступны в SwiftUI?

«Какие способы навигации доступны в SwiftUI?» — вопрос из категории SwiftUI, который задают на 22% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SwiftUI предлагает декларативные API для различных сценариев навигации.

Основные компоненты:

  1. NavigationStack (iOS 16+) — современная замена NavigationView. Поддерживает глубокую навигацию и типобезопасную передачу данных через navigationDestination.

    struct ContentView: View {
        var body: some View {
            NavigationStack {
                List(1..<5) { number in
                    NavigationLink("Item (number)", value: number)
                }
                .navigationDestination(for: Int.self) { value in
                    DetailView(itemId: value) // Переход по значению
                }
            }
        }
    }
  2. NavigationView (устарел) — основа навигации до iOS 16. Использует NavigationLink с явным указанием destination.

  3. Модальные представления:

    • .sheet — стандартное модальное окно.
    • .fullScreenCover — полноэкранное модальное окно.
      @State private var showSettings = false
      Button("Show Settings") { showSettings.toggle() }
      .sheet(isPresented: $showSettings) {
          SettingsView()
      }
  4. TabView — для таб-бара.

    TabView {
        HomeView()
            .tabItem { Label("Home", systemImage: "house") }
        ProfileView()
            .tabItem { Label("Profile", systemImage: "person") }
    }
  5. Программная навигация — через NavigationPath в NavigationStack или состояние, управляемое @StateObject/@ObservableObject (координаторный паттерн).

Рекомендация: Для новых проектов используйте NavigationStack, так как он предоставляет больше контроля над стеком навигации и является будущим фреймворка.