ObservableObject.Тема не новая, но на практике до неё доходят не сразу, особенно если в проекте уже есть устоявшийся подход к работе с состоянием.
🔹 Начиная с iOS 17 в SwiftUI доступен фреймворк Observation, который позволяет отслеживать изменения состояния без использования
ObservableObject, @Published и Combine.Основная идея – упростить работу с состоянием и сократить шаблонный код.
🔹 Классический подход с
ObservableObject работает, но имеет свои особенности:• необходимость явно помечать свойства как
@Published• дополнительный синтаксический шум
• риск забыть опубликовать изменения
• привязка к Combine даже в простых сценариях
Observation предлагает более прямой способ описывать наблюдаемое состояние.
🔹 На уровне кода вместо
ObservableObject используется атрибут @Observable.Старый подход:
class Counter: ObservableObject {
@Published var value = 0
}С Observation:
@Observable
class Counter {
var value = 0
}
🔹 Преимущества такого подхода:
• Нет необходимости писать
@Published, objectWillChange и вспомогательные конструкции.• Меньше риска ошибок, связанных с ручным управлением публикацией изменений.
• Логика наблюдения находится ближе к самой модели.
Пример использования:
@Observable
class TimerModel {
var time: Int = 0
func tick() {
time += 1
}
}
Использование во View:
struct TimerView: View {
@State private var model = TimerModel()
var body: some View {
Text("Time: \(model.time)")
}
}SwiftUI отслеживает изменения
time и обновляет View без дополнительной настройки.🔹 Где Observation особенно уместен:
• простые ViewModel и модели состояния
• логика, не требующая Combine
• случаи, где
ObservableObject использовался только ради обновления UIСледующие механизмы продолжают работать как раньше:
•
@State•
@Binding•
@EnvironmentObjectObservation не заменяет их, а дополняет.
🍕 Observation упрощает работу с состоянием в SwiftUI за счёт уменьшения шаблонного кода и более прямого описания наблюдаемых моделей. Для новых экранов и при постепенном рефакторинге старых
ObservableObject это часто более удобный и читаемый вариант.#R #SwiftUI #Observation