Назад к вопросам
Middle+
106
questionbank
Как сделать класс наблюдаемым начиная с iOS 17?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
import SwiftUI
// Делаем объект наблюдаемым, используя макрос @Observable
@Observable
class UserData {
var name: String = ""
var age: Int = 0
// Свойства, помеченные @ObservationIgnored, не вызывают обновлений при изменении
@ObservationIgnored var internalID: String = UUID().uuidString
}
До iOS 17 использовались:
ObservableObjectпротокол с@Publishedдля свойств.- KVO (Key-Value Observing) для более низкоуровневого наблюдения.
С iOS 17 @Observable вводит более простой и эффективный механизм, основанный на макросах компилятора. При изменении любого наблюдаемого свойства объекта, помеченного @Observable, SwiftUI или другие части фреймворка, которые подписаны на изменения, автоматически обновляют свой UI. Это происходит без необходимости явно указывать @Published или использовать KVO.
Синтаксис:
@Observable
class MyObservableClass {
var someProperty: Int = 0
var anotherProperty: String = ""
// Если не нужно наблюдать за свойством
@ObservationIgnored var nonObservableProperty: Bool = false
}
Использование в SwiftUI (по аналогии с @StateObject или @ObservedObject):
import SwiftUI
struct ContentView: View {
// Создаем экземпляр наблюдаемого класса
@State var userData = UserData()
var body: some View {
VStack {
TextField("Name", text: $userData.name) // Автоматически обновляется при изменении name
Text("Age: \(userData.age)") // Автоматически обновляется при изменении age
Button("Increase Age") {
userData.age += 1
}
}
.padding()
}
}
Основные преимущества @Observable по сравнению с @ObservedObject / @Published:
- Простота: Не нужно помечать каждое свойство с
@Published. - Эффективность: Обновления происходят только при изменении наблюдаемых свойств, а не всего объекта.
- Меньше шаблонного кода: Нет необходимости в
objectWillChange.send(). - Макрос: Работает на уровне компилятора, обеспечивая лучшие оптимизации.
@ObservationIgnored: Позволяет явно исключить свойства из наблюдения.
Это основной способ создания наблюдаемых объектов в iOS 17 и более новых версиях, рекомендованный Apple.