NavigationStack(iOS 16+)은 SwiftUI의 데이터 주도(data-driven) 내비게이션 컨테이너입니다. 뷰 컨트롤러를 명령형으로 push하는 대신, 값의 배열인 path를 바인딩하면 스택이 각 값에 대한 화면을 렌더링합니다. 데이터는 뷰 이니셜라이저와 환경을 통해 아래로 흐르고, 바인딩과 콜백을 통해 위로 흐릅니다.
동작 방식
path를 변경하여 내비게이션을 구동하고, 으로 값 타입을 목적지 뷰에 매핑합니다.
NavigationStack(iOS 16+)은 SwiftUI의 데이터 주도(data-driven) 내비게이션 컨테이너입니다. 뷰 컨트롤러를 명령형으로 push하는 대신, 값의 배열인 path를 바인딩하면 스택이 각 값에 대한 화면을 렌더링합니다. 데이터는 뷰 이니셜라이저와 환경을 통해 아래로 흐르고, 바인딩과 콜백을 통해 위로 흐릅니다.
path를 변경하여 내비게이션을 구동하고, 으로 값 타입을 목적지 뷰에 매핑합니다.
@StatenavigationDestinationstruct AppView: View {
@State private var path: [Route] = [] // 데이터로서의 내비게이션 스택
var body: some View {
NavigationStack(path: $path) {
List(products) { p in
NavigationLink("Open", value: Route.detail(p.id)) // 값 추가
}
.navigationDestination(for: Route.self) { route in
switch route {
case .detail(let id): DetailView(id: id)
}
}
}
}
}
enum Route: Hashable { case detail(Int) }
path가 순수한 데이터이므로, path = [.detail(42)]로 설정해 딥링크하거나, path.removeAll()로 루트까지 pop할 수 있습니다. 내비게이션이 테스트 가능하고 직렬화 가능한 상태가 됩니다.
DetailView(id:))로 값을 전달하거나, .environmentObject(...) / @Environment 시스템으로 횡단 관심사 객체를 공유합니다.@Binding을 변경하거나 부모가 제공한 클로저를 호출합니다.Hashable**이어야 합니다.navigationDestination으로 한 번만 등록하세요. 같은 타입에 대한 여러 등록은 충돌합니다.데이터 주도 내비게이션은 딥링크, 상태 복원, "세 화면 뒤로 pop" 같은 흐름을 사소하게 만듭니다. 스택이 그저 여러분이 소유한 배열이기 때문입니다. 면접관이 이를 묻는 이유는 지원자가 오래된 명령형 NavigationView와 씨름하는 대신 내비게이션을 상태로 모델링하는지 — 현대 SwiftUI 방식 — 를 보기 위함입니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기