SwiftUI @State/@ObservableObject/@EnvironmentObject のメモ
それぞれの違いなどをメモする。
間違いあるかもしれない。
@State
State - SwiftUI | Apple Developer Documentation
SwiftUI Framework に含まれる。
概要
@State の値が変更されると、ビューの表示は再計算される。
State からバインディングを取得するには binding
プロパティか $
プレイフィックス演算子を使用する。($
を使用するパターンが多く見受けられる)
アクセス範囲
@State プロパティにアクセスするには、そのプロパティを持つビューのみ。(原理的にはそのビューの func を外部のビューが呼び出して、プロパティを変更する、はできる)
まとめ
有効範囲は小さく、ローカル。
@State は特定のビューに属する形のデータに使用する。
例えば、ビュー内のボタンを押して、表示を変更する、など。
@ObservableObject
ObservableObject - Combine | Apple Developer Documentation
Combine Framework に含まれる。
概要
複数のビューでデータを共有する場合は @State の代わりに @ObservableObject を使用する。
@State と似ているが、クラスのインスタンスを作成し、独自のプロパティを作成する必要がある。
監視対象オブジェクトがデータが変更されたことをビューに通知する方法はいくつかあるが、最も簡単なのは @Published プロパティラッパーを使用すること。@ObservableObject の変更はすベて自動で通知される。
アクセス範囲
複数ビューからアクセス可能。
まとめ
@State より有効範囲が広い。
例えば施設データがあり、それを List 表示する View とその先の詳細を表示する View がある場合などは施設データは @ObservableObject を使用すると良い。
@EnvironmentObject
https://developer.apple.com/documentation/swiftui/environmentobject
SwiftUI Framework に含まれる。
概要
@State が変更時にビュー更新を自動的に発生させる。
@ObservableObject が変更時にビューの更新を発生させる可能性がある。
@EnvironmentObject はすべてのビューが読み取り可能な、アプリ全体で使用できる共有データ。
まとめ
@State, @ObservableObject よりも有効範囲が広い。
アプリ全体で使用するデータに使用すると良い。
全体まとめ
有効範囲の広さ
@EnvironmentObject > @ObservableObject > @State
適切な使い道
- @State
- ひとつのビュー内の値変更と表示の変更
- @ObservableObject
- 複数のビュー内での共有するデータ(変更通知も可能)
- @EnvironmentObject
- アプリ全体で共有する値