この記事では、@StateObjectの使い方について解説していきたいと思います。
@StateObject とは?
この@StateObjectを理解するには、まず、@ObservedObjectを理解する必要があります。
@ObservedObjectは、Viewが再描画する度にインスタンスを再生成しますが、@StateObjectは、Viewが再描画しても値を保持します。このようにライフサイクルが違うだけで、使い方は、@ObservedObjectと変わりません。
使い方
@StateObjectと@ObservedObjectとの違いを理解するために、簡単なプログラムを書いてみましょう。
以下のコードを貼り付けて動作確認してみてください。
class Fruits: ObservableObject {
@Published var price = 100
}
struct ContentView: View {
@State var redraw = true
var body: some View {
VStack {
ObservedObjectView()
StateObjectView()
Button(redraw ? "再描画":"再描画") {
redraw.toggle()
}
.buttonStyle(.borderedProminent)
}
}
}
struct ObservedObjectView: View {
@ObservedObject var fruits = Fruits()
var body: some View {
VStack {
Text("@ObservedObjectの値:\(fruits.price)")
Button("10円値上げする") {
fruits.price += 10
}
}
.padding()
}
}
struct StateObjectView: View {
@StateObject var fruits = Fruits()
var body: some View {
VStack {
Text("@StateObjectの値:\(fruits.price)")
Button("10円値上げする") {
fruits.price += 10
}
}
.padding()
}
}

動作確認すると、再描画を押したときに、@ObservedObjectで書いたpriceはリセットされます。それに対して、@StateObjectで書いたpriceはリセットされずに値を保持します。
まとめ
このように初期化されるタイミングで、@ObservedObjectと@StateObjectを使い分けていきましょう。
参考文献

