UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

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?

3      

didSet is not trigger for assignments made in init.

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

3      

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.

3      

Hacking with Swift is sponsored by RevenueCat

SPONSORED Take the pain out of configuring and testing your paywalls. RevenueCat's Paywalls allow you to remotely configure your entire paywall view without any code changes or app updates.

Learn more here

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

Archived topic

This topic has been closed due to inactivity, so you can't reply. Please create a new topic if you need to.

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.