SwiftUI Property Wrappers - @EnvironmentObject

sanghoon Ahn·2023년 2월 18일
0

SwiftUI

목록 보기
5/5

부모, 혹은 그 상위 계층의 뷰로부터 전달받은 observable object를 위한 property wrapper

@EnvironmentObject로 선언된 property는 ObservableObject protocol을 준수해야합니다.

observable object가 변경될 때 현재의 뷰를 무효화시킵니다.

property를 envrionment object로 선언한다면 부모뷰에서 대응되는 model이 envronmentObject(_:)의 호출로 셋팅되도록 해야합니다.

App에서 object가 다양한 곳에서 활용되어햐 하고, 하위 뷰들을 생성할때마다 초기값으로 전달하지않기를 원한다면 @EnvtionmentObject를 활용할 수 있습니다.

struct EnvironmentUsingView: View {
    @EnvironmentObject var dependency: DataProvider
    
    var body: some View {
        Text(dependency.currentValue)
    }
}
struct MyApp: App {
    @StateObject var dataProvider = DataProvider()
    
    var body: some Scene {
        WindowGroup {
            EnvironmentUsingView()
            .environmentObject(dataProvider)
        }
    }
}

EnvironmentUsingView의 상위인 MyApp에서 DataProvider Type인 dataProvider를 .environmentObject(_:)로 전달함으로써 모든 하위뷰들이 사용할 수 있도록 할 수 있습니다.

@EnvironmentObject는 @ObservedObject와 비슷한 기능을 제공합니다.

@EnvironmentObject가 하나라도 변경되면 view는 리렌더링 됩니다.

가장 큰 차이점은 @EnvironmentObject가 @ObservedObject 보다 더 큰 앱 전체와 같은 범위에서 사용된다는 점 입니다.

@EnvironmentObject을 사용해야하는 경우는

  • ObservableObject를 사용해야하는데 하위 뷰들을 거쳐 전달되어야 하는 경우
profile
hello, iOS

0개의 댓글