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 Essential Developer

SPONSORED Join a FREE crash course for mid/senior iOS devs who want to achieve an expert level of technical and practical skills – it’s the fast track to being a complete senior developer! Hurry up because it'll be available only until April 28th.

Click to save your free spot now

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.