IOS/SwiftUI
[SwiftUI] @StateObject
Haru_29
2022. 6. 17. 20:04
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()
// ...
}