Post

ObservableObject, @ObservedObject, StateObject

ObservableObject

  • Combine에서 ObservableObject를 사용하는 이유는 해당 프로토콜을 채택한 객체의 상태 변화를 감지하고 UI에 즉시 실시간으로 반영하기 위해서 입니다.
1
2
3
class ViewModel: ObservableObject {
	@Published var count = 0
}

@ObservedObject

  • ObservableObject객체가 부모에서 주입되었을때 사용하는 프로퍼티 래퍼이다.
  • ObservableObject객체가 포함되어있는 뷰에서 @Published프로퍼티가 변경될때 UI를 자동 갱신한다.
  • 뷰의
1
2
3
4
5
6
7
struct ParentView: View {
    @StateObject private var viewModel = ViewModel() // ✅ 부모에서 생성

    var body: some View {
        ChildView(viewModel: viewModel) // ✅ 자식 뷰에 주입
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
struct ChildView: View {
    @ObservedObject var viewModel: ViewModel // ✅ 부모에서 받은 객체 감지

    var body: some View {
        VStack {
            Text("Count: \(viewModel.count)")
            Button("Increment") {
                viewModel.count += 1
            }
        }
    }
}

StateObject

  • @StateObject는 SwiftUI에서 뷰가 메모리에서 해제되지 않는 한 ObservableObject를 채택한 객체의 인스턴스를 유지하는 프로퍼티 래퍼입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class ViewModel: ObservableObject {
    @Published var count = 0
}

struct ContentView: View {
    @StateObject private var viewModel = ViewModel() // ✅ StateObject 사용

    var body: some View {
        VStack {
            Text("Count: \(viewModel.count)")
            Button("Increment") {
                viewModel.count += 1
            }
            NavigationLink("Go to Next", destination: NextView())
        }
    }
}
  • 인스턴스가 부모를 통해 주입되는 것이 아닌 직접 생성해서 사용할 때 해당 래퍼를 사용함.
This post is licensed under CC BY 4.0 by the author.