@EnvironmentObject 와 @StateObject는 둘 다 SwiftUI 에서 상태 관리를 위해 사용하는 중요한 프로퍼티 래퍼인데, 사용 목적과 방법은 조금 다르다.
애플 공식 문서에 따르면
: A property wrapper type for an observable object that a parent or ancestor view supplies.
: A property wrapper type that instantiates an observable object.
@EnvironmentObject는 전역적으로 상태를 공유할 때 사용되며, 여러 뷰가 동일한 상태를 공유할 수 있게 해준다.
이 프로퍼티 래퍼를 사용하려면 상태 객체가 이미 상위 뷰에서 제공되어야 하며, 하위 뷰에서 이를 주입받아 사용한다.
- 상위 뷰에서 하위 뷰로 상태를 전달할 때 사용
- 앱의 여러 뷰에서 동일한 상태를 공유해야 할 때 적합
- 상태가 상위 뷰에서 이미 존재하고, 주입될 때 사용
@StateObject는 상태 객체의 소유권을 가지는 뷰에서 사용된다. 뷰의 생명주기동안 유지되며 뷰가 다시 렌더링 될 때에도 동일한 객체가 유지된다.
- 뷰가 상태 객체를 초기화하고 해당 뷰 내에서 상태를 관리할 때 적합
- 뷰가 생성될 때 한 번만 객체를 생성하며, 뷰가 업데이트될 때 객체를 재사용 (뷰의 생명주기 동안 상태 객체 유지)
- 상태를 소유하는 뷰에서 상태 관리를 할 때 적합
예를 들어 초기 앱 세팅해줄 때 다음과 같이 사용 가능
class AppState: ObservableObject {
@Published var name: String = "hongssup"
}
@main
struct myApp: App {
@StateObject private var appState = AppState()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(appState) // 상태를 하위 뷰에 전달
}
}
}
struct ContentView: View {
@EnvironmentObject private var appState: AppState
var body: some View {
Text("\(appState.name)")
}
}
'Swift iOS 앱 개발 > SwiftUI' 카테고리의 다른 글
SwiftUI 리스트 더 불러오기 - List vs. LazyVStack (1) | 2024.11.21 |
---|---|
[SwiftUI] TextEditor background color change - scrollContentBackground + iOS 15 (0) | 2024.07.09 |