적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/SwiftUI

[SwiftUI] @EnvironmentObject 와 @StateObject 비교 (+ 앱 초기 설정)

hongssup_ 2024. 8. 14. 17:45
반응형

@EnvironmentObject 와 @StateObject는 둘 다 SwiftUI 에서 상태 관리를 위해 사용하는 중요한 프로퍼티 래퍼인데, 사용 목적과 방법은 조금 다르다.

 

애플 공식 문서에 따르면 

EnvironmentObject

: A property wrapper type for an observable object that a parent or ancestor view supplies.

StateObject

: A property wrapper type that instantiates an observable object.

 

@EnvironmentObject는 전역적으로 상태를 공유할 때 사용되며, 여러 뷰가 동일한 상태를 공유할 수 있게 해준다. 

이 프로퍼티 래퍼를 사용하려면 상태 객체가 이미 상위 뷰에서 제공되어야 하며, 하위 뷰에서 이를 주입받아 사용한다. 

- 상위 뷰에서 하위 뷰로 상태를 전달할 때 사용

- 앱의 여러 뷰에서 동일한 상태를 공유해야 할 때 적합

- 상태가 상위 뷰에서 이미 존재하고, 주입될 때 사용

 

@StateObject는 상태 객체의 소유권을 가지는 뷰에서 사용된다. 뷰의 생명주기동안 유지되며 뷰가 다시 렌더링 될 때에도 동일한 객체가 유지된다.

- 뷰가 상태 객체를 초기화하고 해당 뷰 내에서 상태를 관리할 때 적합

- 뷰가 생성될 때 한 번만 객체를 생성하며, 뷰가 업데이트될 때 객체를 재사용 (뷰의 생명주기 동안 상태 객체 유지)

- 상태를 소유하는 뷰에서 상태 관리를 할 때 적합

 

 

예를 들어 초기 앱 세팅해줄 때 다음과 같이 사용 가능

class AppState: ObservableObject {
    @Published var name: String = "hongssup"
}

@main
struct myApp: App {
    @StateObject private var appState = AppState()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(appState) // 상태를 하위 뷰에 전달
        }
    }
}

struct ContentView: View {
    @EnvironmentObject private var appState: AppState
    
    var body: some View {
        Text("\(appState.name)")
    }
}

 

728x90
반응형