В SwiftUI приложении с множеством переходов, можно ли использовать один NavigationLink?

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

Ответ

Технически — да, но это не рекомендуется для статической навигации, так как ухудшает читаемость и поддержку кода. Лучше использовать отдельные NavigationLink для каждого экрана.

Один NavigationLink с параметрами tag и selection оправдан только для динамической навигации, где пункты назначения определяются во время выполнения:

enum AppRoute { case profile, settings, detail(id: UUID) }

struct ContentView: View {
    @State private var activeRoute: AppRoute?

    var body: some View {
        NavigationView {
            VStack {
                Button("Open Profile") { activeRoute = .profile }
                Button("Open Settings") { activeRoute = .settings }
            }
            .background(
                NavigationLink(
                    destination: destinationView(for: activeRoute),
                    tag: activeRoute,
                    selection: $activeRoute,
                    label: { EmptyView() }
                )
            )
        }
    }

    @ViewBuilder
    private func destinationView(for route: AppRoute?) -> some View {
        switch route {
        case .profile: ProfileView()
        case .settings: SettingsView()
        case .detail(let id): DetailView(id: id)
        case nil: EmptyView()
        }
    }
}

Современный подход (iOS 16+): Используйте NavigationStack с модификатором navigationDestination, который декларативно связывает значение с представлением:

NavigationStack(path: $navigationPath) {
    RootView()
        .navigationDestination(for: AppRoute.self) { route in
            switch route {
                case .profile: ProfileView()
                case .settings: SettingsView()
            }
        }
}