App의 모델 데이터와 뷰 간의 connection을 만들어 주는 3가지 property wrapper type을 제공한다.
- ObservedObject
- EnvironmentObject
- StateObject
StateObject의 개념
관찰 가능한 개체를 인스턴스화하는 속성 래퍼 유형입니다.
StateObject의 필요성
SwiftUI는 언제든지 다시 뷰를 생성이 가능하다.
-> 주어진 inputs을 가지고 뷰를 이니셜라이징하면 동일한 뷰가 생성이 된다.
-> 뷰 안에서 ObservedObject를 만드는 것은 안전하지 않다.
대신에 SwiftUI는 이 목적을 위해 StateObject를 제공해준다.
StateObject를 사용하면 뷰안에서 안전하게 ObservedObject 인스턴스를 만들 수 있다.
class Fish: ObservableObject {
@Published var name = "flatfish"
let identifier = UUID()
}
struct AquaView: View {
@StateObject var fish = Fish()
var body: some View {
FishView(fish: fish)
}
}
struct FishView: View {
@ObservedObject var fish: Fish
var body: some View {
FishEditView(fish: fish)
}
}
StateObject는 ObseredObject와 같이 작동을 한다.
차이점으로는 SwiftUI는 뷰를 몇번이든 다시 만드는 것은 상관없이 주어진 view instance에 대해 single object instance를 만들고 관리를 한다.
SwiftUI는 각각의 뷰 인스턴스에 대하여 distinct object instance 를 만든다.
그래서 아래의 예제에서 각각의 Aqua View는 unique fish Instance를 가진다.
VStack {
AquaView()
AquaView()
}
또한 top level App instance나 앱의 Scene instances 중 하나에서 state object를 만들 수 있다.
예를 들어 Fish라는 observable object 를 정의하여fish reader app의 fishes collection을 보관하는 경우, 앱의 최상위 구조에 single library instance를 만들 수 있다.
@main
struct FishReader: App {
@StateObject var fish = Fish()
// ...
}
'IOS > SwiftUI' 카테고리의 다른 글
[SwiftUI] TCA 정리 (0) | 2023.03.01 |
---|---|
[SwiftUI] SwiftUI에서 UserDefaults를 사용 -> @AppStorage (0) | 2022.06.16 |
[SwiftUI] Coredata 사용해보기 (0) | 2022.05.04 |
[SwiftUI] VoiceViewModel 코드 분석하기 (0) | 2022.05.04 |
[SwiftUI] persistentContainer란 무엇인가? (0) | 2022.05.03 |