@ObservedObjectは、SwiftUIにおけるプロパティラッパーの一つです。@ObservedObjectを使うことで、ObservableObjectプロトコルに準拠したオブジェクトの変更を監視し、ビューの再描画をトリガーすることができます。
具体的には、以下の手順で@ObservedObjectを使用します
1、監視したいクラスや構造体を作成し、ObservableObjectプロトコルに準拠させます。このクラスや構造体は、ビューで使用されるデータや状態を保持。
その際には@Published var という形で変数を宣言します。
class MyData: ObservableObject {
@Published var count = 0
func increment() {
count += 1
}
}
2、ビュー内で@ObservedObject属性を使用して、監視したいオブジェクトを宣言します。
struct MyView: View {
@ObservedObject var myData = MyData()
var body: some View {
VStack {
Text("Count: \(myData.count)")
Button("Increment") {
myData.increment()
}
}
}
}
3、@ObservedObject属性を使うことで、ビューはmyDataオブジェクトの変更を監視し、その変更があった場合にビューを再描画します。
上記の例では、MyDataクラスをObservableObjectプロトコルに準拠させています。その中には、@Published属性が付けられたcountプロパティと、そのプロパティを変更するincrementメソッドがあります。
MyViewでは、@ObservedObject属性を使ってmyDataオブジェクトを宣言しています。これにより、ビューはmyDataの変更を監視し、countの値が変更されるたびにビューを再描画します。ボタンをタップすると、incrementメソッドが呼ばれてcountの値が増え、ビューが再描画されて新しい値が表示されます。
@ObservedObjectは、オブジェクトの変更を監視するための重要な機能であり、データの変更をリアルタイムに反映させるのに役立ちます。
以前学習した、@Stateの場合は、@Bindingで渡していましたが、@ObservedObjectの場合は、インスタンスで渡してあげると全てのデータまとめて渡すことができます。
@Bindingとの使い分け
一旦おさらい。
@ObservedObjectは、ビューが特定のオブジェクトの変更を監視するために使用されます。監視するオブジェクトは、ObservableObjectプロトコルに準拠している必要があります。
一般的に、@ObservedObjectはビューとオブジェクトの間の一対多の関係を表します。つまり、ビューが1つのオブジェクトを監視し、そのオブジェクトの状態変化に応じて再描画を行います。
使い分けの例:
親ビューから子ビューに値を渡す場合は、@Bindingを使用します。子ビューが値を変更すると、親ビューにも反映されます。
親ビューが特定のオブジェクトの変更を監視する場合は、@ObservedObjectを使用します。オブジェクトの状態が変化すると、ビューが再描画されます。
要約すると、@Bindingは値の双方向の通信に使用され、ビュー間の関係を表現します。一方、@ObservedObjectはオブジェクトの変更を監視し、ビューを再描画するために使用されます。適切なプロパティラッパーを選択することで、データフローとコミュニケーションの効率性を高めることができます
最初は@Bindingなのか@ObservedObjectのどちらを使えばいいのかわかりませんでしたが、アプリを作るうちに少しずつ慣れてきた気がします。SwiftUI独自の宣言方法に慣れる必要がありますね。