ステート管理(@State、@Binding、@ObservedObject)

SwiftUIにおける**ステート管理(状態管理)**は、ユーザーインターフェースとデータの状態を同期させるための非常に重要な仕組みです。SwiftUIでは、いくつかのプロパティラッパー(属性)を使用することで、UIと状態の関係を簡潔に記述できます。代表的なものとして以下の3つがあります:


1. @State

概要

@Stateは、ビュー内のローカルな状態を保持するためのプロパティラッパーです。SwiftUIがこの変数の変更を監視し、自動的にビューを再描画します。

使用例

swift
struct CounterView: View { @State private var count = 0 var body: some View { VStack { Text("Count: \(count)") Button("Increment") { count += 1 } } } }

特徴

  • Viewの内部専用の状態管理

  • 値が変わると、関連するViewが再描画される。

  • @Stateは構造体(View)の再生成の間も値を保持する。


2. @Binding

概要

@Bindingは、別のViewから渡された@Stateプロパティを双方向に共有するために使います。親Viewから子Viewに状態を渡して、子Viewで変更できるようにします。

使用例(親子関係)

swift
struct ParentView: View { @State private var isOn = false var body: some View { ToggleView(isOn: $isOn) } } struct ToggleView: View { @Binding var isOn: Bool var body: some View { Toggle("Switch", isOn: $isOn) } }

特徴

  • 親Viewの状態を子Viewが変更可能な形で受け取る

  • @State@Bindingペアで使われることが多い。

  • @Bindingの引数には**$(ドル記号)**を付けて渡す。


3. @ObservedObject

概要

@ObservedObjectは、外部の参照型(クラス)を使った状態管理を行うためのプロパティラッパーです。クラスはObservableObjectプロトコルに準拠し、@Publishedを使ってプロパティの変更を通知します。

モデルの定義

swift
class CounterModel: ObservableObject { @Published var count = 0 }

Viewでの使用

swift
struct CounterView: View { @ObservedObject var model: CounterModel var body: some View { VStack { Text("Count: \(model.count)") Button("Increment") { model.count += 1 } } } }

特徴

  • 複数のView間で共有される状態を扱うのに向いている。

  • @Publishedで変更を通知。

  • 参照型であるため、状態が共有されやすい。


比較まとめ

プロパティラッパー 適用対象 使用用途 共有の可否
@State View内のローカル変数 単一View内の状態 不可
@Binding 外部の@State 状態を子Viewに伝播し、双方向で制御
@ObservedObject 外部のクラス 参照型で複数View間の共有

必要に応じて、より高度な@EnvironmentObjectやStateObjectなどの使い方も存在しますが、まずはこの3つを理解しておくことがSwiftUIの状態管理の基礎となります。

生成日:2025/05/04