@StateObject
例えば、以下のように Counter を @ObservedObject として保持していると、@ObservedObject は View の描画の度に初期化されることになり効率が悪いし、状態もリセットされてしまう。View の再描画は、例えば親 View の body が再評価された場合などに発生する。 code:swift
import SwiftUI
class Counter: ObservableObject {
@Published var count: Int = 0
}
struct CounterView: View {
@ObservedObject var counter = Counter()
var body: some View {
HStack {
Text("\(counter.count)")
Button {
counter.count += 1
} label: {
Text("Count up")
}
}
}
}
struct ContentView: View {
@State var count: Int = 0
var body: some View {
VStack(spacing: 16) {
HStack {
Text("\(count)")
Button {
count += 1
} label: {
Text("Count up")
}
}
CounterView()
}
.padding()
}
}
ContentView()
}
また、@StateObject を利用して初期化すると、参照型の初期化が必要以上に走らないというメリットもある。以下のようにコードを書き換えると、親 View の body が再評価されても、init は一回しか呼び出されないことがわかる。 code:swift
class Counter: ObservableObject {
@Published var count: Int = 0
init() {
print("init")
}
}