SwiftUIでデータを画面に反映させるためによく出てくる
@ObservableObject と @StateObject
名前が似ていて混乱しがちですが、それぞれ役割が違います。今回は違いを簡単に説明してみました!
@ObservableObject と @StateObjectの違いは
| 属性名 | 役割 |
|---|---|
@StateObject |
最初にデータを作るときに使う |
@ObservableObject |
すでにあるデータを受け取るときに使う |
そもそも @ObservableObject とは?
@ObservableObject は、外部のデータ(クラス)をSwiftUIのViewに反映させるためのプロトコルです
class CounterModel: ObservableObject {
@Published var count = 0
}
↑このようにObservableObjectを使うことで、countの変更をビューが見れることができます!
@StateObject はどう使うのか?
@StateObject は、SwiftUIのViewの中で ObservableObject を初めて作るときに使います。
struct CounterView: View {
@StateObject var counter = CounterModel()
var body: some View {
VStack {
Text("Count: \(counter.count)")
Button("増やす") {
counter.count += 1
}
}
}
}
ここでは、ビューの中でカウンター用のデータ(CounterModel)を作って、それを使っています。
この最初にインスタンスを作るケースでは、@StateObject を使います。
@ObservableObject はどう使うのか?
@ObservableObject は、すでにどこかで作られたインスタンスを受け取って使うときに使います。
struct ChildView: View {
@ObservedObject var counter: CounterModel
var body: some View {
Button("子ビューでも増やす") {
counter.count += 1
}
}
}
例えば親ビューで @StateObject として作った counter を、
子ビューで受け取りたいときに @ObservedObject を使います。
もっとシンプルでわかりやすく例えると
データを「メモ帳」と例えてみましょう。
@StateObject → 自分の机に新しいメモ帳を作る
@ObservedObject → 誰かが作ったメモ帳をもらって使う
- 自分で新しいメモ帳を作るときは @StateObject
- 誰かのメモ帳を借りて使うときは @ObservedObject
まとめ
| シーン | 属性 |
|---|---|
| Viewの中で新しくデータを作る | @StateObject |
| 外から受け取ったデータを使う | @ObservedObject |
@ObservableObject と @StateObjectはアプリ開発で頻繁に使うものなのでぜひ、この記事を参考にしてください!✌️