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      

BUILD THE ULTIMATE PORTFOLIO APP Most Swift tutorials help you solve one specific problem, but in my Ultimate Portfolio App series I show you how to get all the best practices into a single app: architecture, testing, performance, accessibility, localization, project organization, and so much more, all while building a SwiftUI app that works on iOS, macOS and watchOS.

Get it on Hacking with Swift+

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.