Jupyo's Daily Story
@EnvironmentObject 본문
728x90
반응형
@EnvironmentObject는 SwiftUI에서 앱의 여러 뷰들 사이에서 공통 상태를 공유하고, 쉽게 전달할 수 있도록 도와주는 프로퍼티 래퍼입니다. 이는 주로 전역적인 상태나 공유 상태를 관리할 때 사용됩니다.
@EnvironmentObject는 부모 뷰에서 자식 뷰로 명시적으로 상태를 전달할 필요 없이, 뷰 계층 전체에서 사용할 수 있게 해줍니다.
기본 개념
- 공유 상태 관리: @EnvironmentObject는 하나의 객체를 여러 뷰에서 참조하고, 그 상태를 쉽게 변경하거나 접근할 수 있게 합니다. 이 객체는 주로 ObservableObject 프로토콜을 채택한 클래스로 만들어집니다.
- 자동 전달: @EnvironmentObject는 뷰 간의 계층 구조에서 자동으로 전달되기 때문에, 명시적으로 뷰 간에 데이터를 전달할 필요가 없습니다. 이는 복잡한 뷰 계층에서도 매우 유용합니다.
사용 방법
- ObservableObject 정의: @EnvironmentObject로 사용할 상태 객체는 ObservableObject 프로토콜을 채택한 클래스로 정의되어야 합니다.
- EnvironmentObject로 주입: 부모 뷰에서 environmentObject(_:) 메서드를 사용하여 뷰 계층에 해당 상태 객체를 주입합니다.
- @EnvironmentObject로 사용: 자식 뷰에서는 @EnvironmentObject로 상태 객체에 접근합니다.
코드 예시
ObservableObject 클래스 정의
import SwiftUI
import Combine
class UserSettings: ObservableObject {
@Published var username: String = "Guest"
}
- UserSettings 클래스는 ObservableObject를 채택하고, @Published를 사용하여 username 상태가 변경될 때마다 이를 감지할 수 있도록 만듭니다.
부모 뷰에서 environmentObject 사용
struct ParentView: View {
@StateObject private var userSettings = UserSettings()
var body: some View {
ChildView()
.environmentObject(userSettings) // userSettings 객체를 뷰 계층에 주입
}
}
- ParentView에서 UserSettings 객체를 @StateObject로 생성하고, environmentObject(_:) 메서드를 사용해 뷰 객체에 이 객체를 전달합니다.
자식 뷰에서 @EnvironmentObject 사용
struct ChildView: View {
@EnvironmentObject var userSettings: UserSettings
var body: some View {
VStack {
Text("Username: \(userSettings.username)")
Button("Change Username") {
userSettings.username = "NewUser"
}
}
}
}
- ChildView에서 @EnvironmentObject를 사용해 userSettings에 접근합니다. 이 상태 객체는 ParentView에서 전달받은 객체와 동일하며, 이를 수정할 때 부모 뷰와 모든 자식 뷰에 반영됩니다.
주요 특징
- 전역적 상태 공유: @EnvironmentObject는 앱의 여러 뷰에서 동일한 객체를 공유하므로, 전역 상태 관리가 필요할 때 유용합니다. 예를 들어 사용자 설정이나 로그인 상태와 같은 데이터를 쉽게 공유할 수 있습니다.
- 자동으로 전달: 뷰 계층에서 명시적으로 데이터를 전달하지 않아도 되기 때문에, 매우 복잡한 뷰 계층 구조에서도 사용하기 좋습니다.
- 반응형 업데이트: @EnvironmentObject로 참조된 객체가 변경될 때, 해당 객체를 참조하는 모든 뷰가 자동으로 업데이트됩니다.
@Binding 및 @State와의 차이점
- @State: 특정 뷰 내부에서만 상태를 관리할 때 사용됩니다. 상태는 뷰 내부에서만 국한됩니다.
- @Binding: 부모 뷰의 상태를 자식 뷰에 전달하고, 자식 뷰에서 그 상태를 수정할 때 사용됩니다.
- @EnvironmentObject: 전역 상태를 여러 뷰에 걸쳐 쉽게 전달하고, 관리하는 데 사용됩니다. 상위 뷰에서 전달한 상태 객체를 계층 구조 전체에서 사용할 수 있습니다.
@EnvironmentObject의 장점
- 간편한 상태 전달: 자식 뷰에서 명시적으로 상태를 전달할 필요가 없으며, 뷰 계층 어디에서나 객체에 접근할 수 있습니다.
- 전역 상태 관리: 로그인 정보나 테마 설정과 같이 앱 전역에서 필요로 하는 상태를 쉽게 관리할 수 있습니다.
- 리팩토링 용이성: 뷰 계층이 깊어져도 상태 전달이 자동으로 이루어지기 때문에, 코드 리팩토링 시에도 쉽게 상태 관리를 유지할 수 있습니다.
결론
@EnvironmentObject는 SwiftUI에서 앱의 여러 뷰 간에 전역적인 상태를 공유하고 관리하는 데 매우 유용한 도구입니다. 이를 통해 뷰 계층 간에 복잡한 상태 전달 없이 상태를 자동으로 공유하고 관리할 수 있습니다.
ObservableObject와 함께 사용하면 상태가 변경될 때 자동으로 UI가 업데이트되므로, 반응형 앱을 쉽게 만들 수 있습니다.
반응형
'SwiftUI' 카테고리의 다른 글
ObservableObject (0) | 2020.10.15 |
---|---|
@State (0) | 2020.10.15 |
Spacing & Spacer (0) | 2020.10.13 |
ForEach (0) | 2020.10.13 |
Image RenderingMode (0) | 2020.10.12 |