[SwiftUI] @StateObject
Managing Model Data in Your App 문서를 보면
App의 모델 데이터와 뷰 간의 connection을 만들어 주는 세가지 property wrapper type 을 소개해줍니다.
- ObservedObject iOS 13+
- EnvironmentObject iOS 13+
- StateObject iOS 14+
ObservedObject 랑 EnvironmentObject는 작년에 살펴봐서
안살펴본 StateObject 만 정리해보겠습니다.
StateObject 의 정의
A property wrapper type that instantiates an observable object.
StateObject 왜 필요한가?
(Managing Model Data in Your App 문서 > Instantiate a Model Object in a View 부분 내용입니다)
SwiftUI는 언제든지 뷰를 다시 만들 수 있습니다.
그 결과, 뷰 안에서 ObservedObject를 만드는 것은 안전하지 않습니다.
대신에 SwiftUI는 이 목적을 위해 StateObject를 제공해줍니다.
StateObject를 사용하면 뷰안에서 안전하게 ObservedObject 인스턴스를 만들 수 있습니다.
StateObject는 ObservedObject 와 같이 동작합니다.
차이점은 SwiftUI가 뷰를 몇번이나 다시 만드는 지 상관없이 주어진 view instance에 대해 single object instance를 만들고 관리한다는 점입니다.
위의 예제처럼 다른 뷰(BookView)의 observed object 프로퍼티로 state object를 넘길 수 있습니다.
SwiftUI는 각각의 뷰 인스턴스에 대하여 distinct object instance 를 만듭니다.
그래서 아래의 예제에서 각각의 Library View는 unique Book Instance를 가집니다.
또한 top level App instance나 앱의 Scene instances 중 하나에서 state object를 만들 수 있습니다.
예를 들어 Library라는 observable object 를 정의하여 book reader app의 books collection을 보관하는 경우, 앱의 최상위 구조에 single library instance를 만들 수 있습니다.