Tunko Development Diary

[SwiftUI] Environment 객체 정리 본문

Development/iOS 개발

[SwiftUI] Environment 객체 정리

Tunko 2021. 2. 23. 00:39

구독 객체는 특정 상태가 앱 내의 몇몇 SwiftUI 뷰에 의해 사용되어야 할 겨우에 가장 적합하다. 그런데 어떤 뷰에서 다른뷰로 이동(navigation) 하는데 이동될 뷰에서도 동일한 구독 겍체에 접근해야 한다면, 이동할 떄 대상 뷰로 구독 객체에 대한 참조체를 전달해야 할 것이다.
다음 코드에 예제를 살펴보자

@ObservedObject var demoData : DamoData = DemoData()

NavigationLing(destination : SecondView(demoData)) {
    Text("Next Screen")
}

앞의 코드 선언부에서 NavigationLink는 SecondView라는 이름의 다른 뷰로 이동하기 위해 사용되며, demoData객체에 대한 참조체를 전달한다.

이 방법은 여러 상황에 사용될 수 있지만, 앱 내의 여러 뷰가 동일한 구독 객체에 접근해야 하는 경우에는 복잡해질 수 있다. 이런 상황에서는 Environment 객체를 사용하는것이 더 합리적일 수 있다.

Environment 객체는Observable객체와 같은 방식으로 선언된다. 즉, 반드시 Observable Object프로토콜을 따라야 하며, 적절한 프로퍼티가 게시되어야 한다. 하지만, 중요한 차이점은 이 객체는 SwiftUI 환경에 저장되며, 뷰에서 뷰로 전달할 필요없이 모든 뷰가 접근할 수 있다는 것이다.

Environment 객체를 구독해야 하는 객체는 @ObservedObject 래퍼 대신에 @Environment Object 프로퍼티 래퍼를 이용하여 해당 객체를 참조하면 된다.

@EnvironmentObject var demoData: DemoData

Environment 객체는 옵저버(observer) 내에서 초기화될 수 없으므로 접근하는 뷰가 화면을 설정하는 동안 구성해야 한다. 여기에는 프로젝트의 SceneDelegate.swift 파일의 willConnectTo 메서드를 약간 수정하는 작업이 포함된다. 디폴트로, 이 메서드에는 다음과 같은 코드가 포함된다.

let contentView = ContentView()
let demoData = DemoData()

if let windowScene = scene as? UIWindowScene {
    let window = UIWindo(windowScene: windowScene)
    window.rootViewController = UIHostingController(rootView: contentView.environmentObject(demoData))
    self.window = window
    window.makeKeyAndVisible()
}

SwiftUI 프리뷰 캔버스 내에서 Environemt 객체를 사용하려면 PriviewProvider 선언 부분은 다음과 같이 수정되어야 한다.

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(DemoData())
    }
}

요약

SwiftUI는 사용자 인터페이스와 앱의 로직에 데이터를 바인딩하는 방법 세 가지를 제공한다. 상태 프로퍼티는 사용자 인터페이스 레이아웃 내의 뷰 상태를 저장하는 데 사용되며, 현재 콘텐트 뷰에 관한 것이다. 이 값은 임시적이여서 해당 뷰가 사라지면 값도 없어진다.

사용자 인터페이스 밖에 있으며 앱 내의 SwiftUI뷰 구조체의 하위 뷰에만 필요한 데이터는 Observable객체 프로퍼티를 사용해야 한다. 이 방법을 사용하면 데이터를 표시하는 클래스나 구조체는 ObservableObject 프로토콜을 따라야 하며, 뷰와 바인딜 될 프로퍼티는 @Published 프로퍼티 래퍼를 사용하여 선언되어야 한다. 뷰 선언뷰에 Observable 객체 프로퍼티와 바인딩 하려면 프로퍼티는 @ ObservedObject 프로퍼티 래퍼를 사용해야 한다.

사용자 인터페이스 밖에 있으며 여러 뷰가 접근해야 하는 데이터일 경우에는 Environment 객체가 최고의 해결책이 된다. observable객체와 동일한 방법으로 선언되지만, Environment객체 바인딩은 @EnvironmentObject 프로퍼티 래퍼를 사용하여 SwiftUI 뷰 파일 내에 선언된다. SceneDelegate.swift 파일의 코드를 통해 뷰 화면이 앱에 추가될 때 Environment 객체 또한 초기화 되어야 한다.

출처 : SwiftUI 기반의 iOS 프로그래밍

반응형
Comments