I have a very basic view that only shows a TextField
:
View
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
TextField("Enter a string...", text: $viewModel.string)
}
}
The TextField
's text is bound to a string
property on the view model:
ViewModel
class ViewModel: ObservableObject {
@Published var string: String = "" {
didSet {
print("didSet string:", string)
}
}
}
I added a didSet
property observer to perform a custom action whenever the string changes. For this simple example, I only print a string on the console.
Observation
When I run this code and enter the string "123" into the text field, this is the output I get:
didSet string: 1
didSet string: 1
didSet string: 12
didSet string: 12
didSet string: 123
didSet string: 123
Question:
Why?
Why is the didSet
closure called twice for each character I type?
(I would expect it to be called once for each character.)
Is there anything wrong with the code or is this expected behavior somehow? π€
$string.sink {...}
? β Brusa