I’ve encountered a weird behavior: when I add a Publisher conformance to a class, setters and getters of it's properties stop be called.
This code works as expected:
import Foundation
import Combine
struct Box {
let root = Root()
var nested: Nested {
get {
root.nested
}
set {
root.nested = newValue
}
}
}
class Root {
private var _nested = Nested()
var nested: Nested {
get {
print("Accessing nested value")
return _nested
}
set {
print("Will Set nested value")
defer {
print("Did set nested value")
}
self._nested = newValue
}
}
}
struct Nested {
private var _value: Int = 0
var value: Int {
get {
print("Accessing value")
return _value
}
set {
print("Will modify value")
defer {
print("Did modify value")
}
_value = newValue
}
}
}
var box = Box()
box.nested.value = 42
box.nested = Nested()
Output:
Accessing nested value
Will modify value
Did modify value
Will Set nested value
Did set nested value
Will Set nested value
Did set nested value
but this:
import Foundation
import Combine
struct Box {
let root = Root()
var nested: Nested {
get {
root.nested
}
set {
root.nested = newValue
}
}
}
class Root: Publisher {
private var _nested = Nested()
var nested: Nested {
get {
print("Accessing nested value")
return _nested
}
set {
print("Will Set nested value")
defer {
print("Did set nested value")
}
self._nested = newValue
}
}
typealias Output = Void
typealias Failure = Never
func receive<S>(subscriber: S) where S : Subscriber, Void == S.Input, Never == S.Failure {
}
}
struct Nested {
private var _value: Int = 0
var value: Int {
get {
print("Accessing value")
return _value
}
set {
print("Will modify value")
defer {
print("Did modify value")
}
_value = newValue
}
}
}
var box = Box()
box.nested.value = 42
box.nested = Nested()
Output:
Will modify value
Did modify value