Назад к вопросам
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 использовались:

  1. ObservableObject протокол с @Published для свойств.
  2. 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.