← 메인으로

0817-2 상태, 바인딩 정리

간단 요약(외워두면 편할 듯)

언제 무엇을 쓰나(의사결정)

  1. 이 데이터, 이 뷰 안에서만 쓰고 끝 -> @State / @Binding
  2. 참조형 모델을 여기서 만들고 자식들에 내려줄 예정 -> 부모는 @StateObject, 자식은 @ObservedObject
  3. 뷰가 여기저기 많고 중간 단계 전부에 파라미터로 전달하기 귀찮다 -> @EnvironmentObject + 상위에서 .environmentObject() 주입

올바른 코드 패턴 3종

뷰 로컬 상태(@State)

struct CounterView: View { @State private var count = 0 var body: some View { Button("Count: \(count)") { count += 1 } } } 

부모가 소유(@StateObject) -> 자식이 구독(ObservedObject)

final class DemoData: ObservableObject { @Published var name = "James" } struct FirstView: View { @StateObject private var demoData = DemoData() // 내가 생성 및 소유 var body: some View { NavigationStack { VStack { Text(demoData.name) NavigationLink("Next") { SecondView(demoData: demoData) // 자식으로 전달 } } } } } struct SecondView: View { @ObservedObject var demoData: DemoData // 전달받은 걸 구독만 var body: some View { Text("Hello, \(demoData.name)") } } 

여러 화면에서 공유(@EnvironmentObject)

final class SpeedSetting: ObservableObject { @Published var speed = 0.0 } // 가장 안전: App루트에서 주입 @main struct MyApp: App { @StateObject private var speedSetting = SpeedSetting() var body: some Scene { WindowGroup { ContentView() .environmentObject(speedSetting) // 여기서 한 번 주입 } } } struct ContentView: View { var body: some View { VStack { SpeedControlView() SpeddDisplayView() } } } struct SpeedControlView: View { @EnvironmentObject var speedSetting: SpeedSetting var body: some View { Slider(value: $speedSetting.speed, in: 0...100) // 바인딩은 $ } } struct SpeedDisplayView: View { @EnvironmentObject var speedSetting: SpeedSetting var body: some View { Text("Speed = \(Int(speedSetting.speed))") } } 

[!note] 음... 한 70% 이해한 것 같다. 이건 계속 반복해서 쓰다보면 더 익숙해질 것 같긴 함.

왜 ContentView에서 let speedSetting = SpeedSetting()이 위험한가?

Navigation으로 전달 vs Environment로 공유

자주 나는 실수들

마지막 한 줄 요약