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
    • アプリ全体で共有する値

参考