Ответ
В SwiftUI (начиная с iOS 17) добавлен новый модификатор onChange(of:initial:_:), который заменяет устаревший onChange(of:perform:).
Ключевые улучшения:
- Параметр
initial: Позволяет выполнить код при первоначальной привязке значения, а не только при его изменении. - Улучшенное замыкание: Принимает и старое (
oldValue), и новое (newValue) значение, что устраняет необходимость хранения предыдущего состояния вручную.
Пример использования:
@State private var searchText = ""
TextField("Search...", text: $searchText)
.onChange(of: searchText, initial: true) { oldValue, newValue in
// Выполнится при первом рендере (initial: true) и при каждом изменении
print("Поиск изменился с '(oldValue)' на '(newValue)'")
performSearch(query: newValue)
}
Почему это лучше? Старый onChange не предоставлял старого значения и не мог выполнить действие при инициализации, что часто требовало дополнительного кода в onAppear.