본문 바로가기
iOS

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

by GODOLs 2023. 10. 11.

목차

    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의 차이를 설명하도록 하겠습니다.

    반응형