この記事では、@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を使い分けていきましょう。
参考文献