What is ObservableObject and @ObservedObject and @Published on SwiftUI?



1. ObservableObject

class User : ObservableObject {

    let name = "User Name"

    @Published var score = 0

}

@State is single source of truth to save view's state.

In other words, ObservableObject is used to save model out of view.

On example, User class extends ObservableObject.

We want view change when User class's value changes.

(ObservableObject is protocol and extends AnyObject, so Struct and Enum can not extend ObservableObject)


2. @ObservedObject

import SwiftUI


struct ContentView: View {

    @ObservedObject var user: User

    

    var body: some View {

        VStack(spacing: 30){

            Text(user.name)

            

            Button(action: { self.user.score += 1 }) {

                Text(user.score.description)

            }

            

        }.padding()

    }

}

@ObservedObject is attribute to notify that view is dependent on this property.

So, view can change when User's value change.


3. @Published

class User : ObservableObject {

    let name = "User Name"

    @Published var score = 0

}

However, view can not know when it change.

Because User has serveral property.

So, @Published means view is dependent on this value.