iOS

[iOS/SwiftUI] SwiftUI에서 @EnvironmentObject 설명 및 사용법

GODOLs 2023. 10. 11. 14:25

1. EnvironmentObject란?

EnvironmentObject는 SwiftUI의 데이터 흐름을 지원하는 하나의 툴입니다. 특정 데이터를 view 계층 구조 전체에 걸쳐서 전달하는데 사용됩니다. 그렇기 때문에 자식 뷰들이 부모 뷰에서 제공하는 데이터나 객체에 액세스할 수 있도록 해줍니다.

이를 사용하면 여러 뷰들 간에 데이터를 공유하거나 상태를 유지하는데 도움이 됩니다.

2. 사용 사례

예를 들어, 사용자 설정이나 인증 정보와 같은 앱 전체에서 사용될 수 있는 정보를 보관하고자 할 때 EnvironmentObject를 사용할 수 있습니다.

3. 사용법

3.1. ObservableObject로 데이터 생성

먼저, EnvironmentObject로 사용될 데이터나 객체는 ObservableObject 프로토콜을 준수해야 합니다.

class UserData: ObservableObject {
    @Published var username: String = "Guest"
    @Published var isLoggedIn: Bool = false
}

3.2. 상위 뷰에서 EnvironmentObject 제공

이제 EnvironmentObject를 사용하여 UserData 객체를 뷰 계층에 제공하겠습니다.

struct ContentView: View {
@StateObject var userData = UserData() 
    var body: some View {
        HomeView()
            .environmentObject(userData) // HomeView 안의 자식뷰에서는 UserData를 어디든지 불러올 수 있습니다. 
    }
}

3.3. 하위 뷰에서 EnvironmentObject 사용

하위 뷰에서는 @EnvironmentObject 속성 래퍼를 사용하여 해당 객체에 액세스합니다.

struct HomeView: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        VStack {
            Text("Welcome, \(userData.username)")
            Button(action: {
                userData.isLoggedIn.toggle()
            }) {
                Text(userData.isLoggedIn ? "Log Out" : "Log In")
            }
        }
    }
}

4. 주의 사항

  • EnvironmentObject는 view 계층의 상위에서 제공되어야 합니다. 그렇지 않으면 런타임 오류가 발생할 수 있습니다.
  • EnvironmentObject는 참조 유형(reference type)인 클래스(Class)를 기반으로 해야합니다. 값 유형(value type)인 구조체(Struct)에는 사용할 수 없습니다.

5. 결론

EnvironmentObject는 SwiftUI에서 데이터를 효과적으로 전달하고 관리하는 데 중요한 역할을 합니다. 하지만 올바르게 사용하기 위해서는 상위 뷰에서 제공하고, 필요한 모든 하위 뷰에서 해당 객체에 액세스하는 것을 잊지 말아야 합니다.

다음 포스팅에서는 Swift에서 앱 전역을 관리하는 Singleton과 EnvironmentObject의 차이를 설명하도록 하겠습니다.

반응형