SwiftUIのデータバインディングの仕組みである@State、@ObservedObject、@EnvironmentObject各々の特徴について解説します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Xcode】12.2
【Swift】5.3.1
【iOS】14.2
【macOS】Catalina バージョン 10.15.7
【Swift】5.3.1
【iOS】14.2
【macOS】Catalina バージョン 10.15.7
SwiftUIのデータバインディングとは
データとViewを紐付けて、データの更新だけで、紐付けられたViewが再描画される仕組みです。
これにより、データの更新をViewに値を反映する処理を、開発者が手動で行う必要がなくなるのがSwiftUIの大きな特徴です。
@State
- プロパティとViewを紐付ける仕組みです。
- SwiftUIのViewはStructの為、通常ではプロパティを更新できませんが、@Stateを付けると更新可能になります。
- @Stateプロパティの値が変化すると、そのプロパティを参照しているViewがSwiftUIによって自動的に再描画されます。
- プロパティには一般的な型(intやStringの他に)値型であるstruct(構造体)も使用可能です。
- プロパティにデータクラス(classのインスタンス)は使えません。この場合は、後述する@ObservedObjectか@EnvironmentObjectを使用します。参照型であるclassは内部のプロパティが変化してもインスタンス自体が変化しない為、Viewの再描画は発生しません。
- 対象プロパティの参照(Binding)をバケツリレーのように渡す事で、配下の子Viewや孫Viewからも対象プロパティにアクセス可能となります。
【SwiftUI】@Stateの使い方
(2021/05/22 更新) SwiftUIのデータバインディングの仕組みの一つである、@Stateについて解説します。 プロパティが更新された場合に、参照しているViewも同時に更新される仕組みが実現できます。 その他のデータバインディ...
@ObservedObject
- データクラス(classのインスタンス)とViewを結びつける仕組みです。
- インスタンスのプロパティの変化を監視し、値が変化すると、そのプロパティを参照しているViewがSwiftUIによって自動的に再描画されます。
- 対象のclassはObservableObjectプロトコル(名前が似ているので混乱注意)に準拠し、@Published属性が付加されたプロパティのみが監視対象となります。
- バケツリレーのように子Viewにインスタンスを引き渡す事で、配下のViewでも同一のインスタンスにアクセス可能です。
【SwiftUI】@ObservedObjectの使い方
(2020/11/28 更新) SwiftUIのデータバインディングの仕組みの一つで、データクラスの更新を監視する@ObservedObjectの使い方を解説します。 これを利用すると複数のViewから同一インスタンスへの同期が可能になりま...
@EnvironmentObject
- @ObserverdObjectと同様に、データクラス(classのインスタンス)とViewを紐付ける仕組みです。
- @ObserverdObjectとの違いは、バケツリレーのように子Viewに引き渡さなくても、配下のViewからインスタンスにアクセスできます。インスタンスを階層トップのViewに紐付けておく事で、アプリケーション全体からアクセス可能になります。
- アプリケーション全体で共有するようなデータを扱う用途で使用します。
【SwiftUI】@EnvironmentObjectの使い方
SwiftUIのデータバインディングの仕組みの一つで、アプリケーション全体でデータを共有する為の@EnvironmentObjectの使い方を解説します。 その他のデータバインディングについてはこちらの記事を御覧ください。
ObservableObjectプロトコル
- @ObservedObjectあるいは@EnvironmentObjectとしてViewと紐付けるクラスに適用するプロトコルです。
- プロパティに@Published属性を付加する事で、SwiftUIの監視対象とし、値の変更がViewに連携されます。
あわせて読みたい記事
【SwiftUI】@Stateの使い方
(2021/05/22 更新) SwiftUIのデータバインディングの仕組みの一つである、@Stateについて解説します。 プロパティが更新された場合に、参照しているViewも同時に更新される仕組みが実現できます。 その他のデータバインディ...
【SwiftUI】@ObservedObjectの使い方
(2020/11/28 更新) SwiftUIのデータバインディングの仕組みの一つで、データクラスの更新を監視する@ObservedObjectの使い方を解説します。 これを利用すると複数のViewから同一インスタンスへの同期が可能になりま...
【SwiftUI】@EnvironmentObjectの使い方
SwiftUIのデータバインディングの仕組みの一つで、アプリケーション全体でデータを共有する為の@EnvironmentObjectの使い方を解説します。 その他のデータバインディングについてはこちらの記事を御覧ください。