0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwiftUIの @ObservableObject と @StateObject の使い分けをわかりやすく解説

0
Posted at

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 → 誰かが作ったメモ帳をもらって使う

まとめ

シーン 属性
Viewの中で新しくデータを作る @StateObject
外から受け取ったデータを使う @ObservedObject

@ObservableObject@StateObjectはアプリ開発で頻繁に使うものなのでぜひ、この記事を参考にしてください!✌️

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?