NEW: Learn to build the incredible iOS 15 Weather app today! >>

didSet does not fire on @Published property when assign(to:) is used

Forums > Swift

The didSet observer does not fire when the value is changed due to the assignment. Is this a bug or a feature?

struct ContentView: View {
    @StateObject var v = vm()
    var body: some View {
        Text(String(v.b))
            .padding()
    }
}

class vm: ObservableObject {
    @Published var b = false {
        didSet {
            print("hello didSet \(b)")
        }
    }

    let pub = CurrentValueSubject<Bool, Never>(false)

    init() {
        self.b = true
        pub.assign(to: &$b)
        self.pub.send(true)
        self.pub.send(false)
    }
}

Expected output:

hello didSet true

hello didSet false

hello didSet true

hello didSet false

Actual output:

hello didSet true

Assigning the value with .sink() is a workaround but why doesn't assign(to:) trigger the didSet observer?

   

didSet is not trigger for assignments made in init.

Although I am not entirely sure where are you getting the single true value

   

didSet does fire for assignments made in init, it just doesn't fire after the intial assignment which was at the declaration. That's where the single true value comes from. You can also delay the sending to the subject until after the init and it still doesn't fire.

   

Hacking with Swift is sponsored by Sentry

SPONSORED With Sentry’s error and performance monitoring for iOS, you see mobile vitals that actually matter, can solve any latency issues quickly, and learn how each release is performing over time.

Learn More

Sponsor Hacking with Swift and reach the world's largest Swift community!

Reply to this topic…

You need to create an account or log in to reply.

All interactions here are governed by our code of conduct.

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.