ナトーアプリ工房

iOS開発やApple製品の情報発信ブログです

【SwiftUI】@ObservedObject

@ObservedObject

インスタンスでViewを更新したい場合は@Stateでは無く@ObservedObjectを使います

@ObservedObjectが付いたインスタンスのプロパティが変更された時にViewを更新します

 

インスタンスの元となるクラスには ObservableObject プロトコルを付けます

インスタンスを作成する際に@ObservedObjectを付けます

③Viewを更新したいプロパティには@Publishedを付けます

 

【Viewが更新されない例】

import SwiftUI

 

struct ContentView: View {

    var フルーツ = クラス(果物:"🍎", 数:1)

    var body: some View {

        VStack {

            Button(action: 関数1, label: {

                Text("果物を変える")

            })

            Button(action: 関数2, label: {

                Text("個数を変える")

            })

            Text("\(フルーツ.果物)\(フルーツ.)個買いました")

        }

        

    }

    func 関数1() {

        switch フルーツ.果物{

        case "🍎":

            フルーツ.果物 = "🍌"

        default:

            フルーツ.果物 = "🍎"

        }

    }

    func 関数2() {

        フルーツ. = フルーツ. + 1

        }

}   

class クラス {

    var 果物 :String

    var :Int

    init(果物:String, 数:Int) {

        self.果物 = 果物

        self. = 数

    }

}

 

struct ContentView_Previews: PreviewProvider {

    static var previews: some View {

        ContentView()

    }

 

ボタンをクリックしてもViewが更新されません

 

【Viewを更新させる例】

import SwiftUI

 

struct ContentView: View {

    @ObservedObject var フルーツ = クラス(果物:"🍎", 数:1)

    var body: some View {

        VStack {

            Button(action: 関数1, label: {

                Text("果物を変える")

            })

            Button(action: 関数2, label: {

                Text("個数を変える")

            })

            Text("\(フルーツ.果物)\(フルーツ.)個買いました")

        }

        

    }

    func 関数1() {

        switch フルーツ.果物{

        case "🍎":

            フルーツ.果物 = "🍌"

        default:

            フルーツ.果物 = "🍎"

        }

    }

    func 関数2() {

        フルーツ. = フルーツ. + 1

        }

}

class クラス: ObservableObject {

    @Published var 果物 :String

    @Published var :Int

    init(果物:String, 数:Int) {

        self.果物 = 果物

        self. = 数

    }

}

 

struct ContentView_Previews: PreviewProvider {

    static var previews: some View {

        ContentView()

    }

 

ボタンをクリックするとviewが更新されます