Rely on @Published Property Wrapper Events, Not the Observed Object

Pop quiz!

What is the output of this program, e.g. when run in a playground or an autoclosure block?

import Combine

class ValueHolder {
    @Published var value: Int = 0
    init() {}
}

let valueHolder = ValueHolder()
let sub = valueHolder.$value.sink { value in
    print("received", value, "- persisted", valueHolder.value)
}
valueHolder.value = 4
valueHolder.value = 2
Spoiler: Solution
received 0 - persisted 0
received 4 - persisted 0
received 2 - persisted 4

The documentation indicates as much, but it can still be a surprise in your programs when you treat the @Published event as a mere signal to read multiple values from the observed object.

So remember that @Published publishes events in its willSet.