Formation PUB900 : Développer une application pour iPhone avec SwiftUI, H-2024 Observer les changements à un objet

52.1 @Observable


La notion d'observation avec SwiftUI permet à une vue de surveiller un objet et d'être automatiquement mise à jour lorsqu'une de ses propriétés change. Ce mécanisme est similaire à la notion d'écouteur (listener) dans d'autres langages de programmation.

Rendre une classe observable

Pour qu'une classe soit observable, il suffit de la décorer avec la macro @Observable.

Dans cet exemple, les vues qui utilisent un objet de cette classe seront avisées des changements que la classe apporte aux propriétés valeur et message de l'objet.

SwiftUI

@Observable
class MaClasseObservable {
  var valeur: Double = 0.0
  var message: String = ""
  ...
}

Exclure une propriété de l'observation

Par défaut, toutes les propriétés de la classe seront observables.

Il est possible d'exclure certaines propriétés du mécanisme d'observation en les décorant avec la macro @ObservationIgnored. Ceci est utile pour des propriétés internes qui n'ont pas d'impact sur l'interface.

Ici, l'objet uneProprieteObjet n'a pas à être observé. Les vues qui utilisent la classe travailleront seulement avec valeur et message.

SwiftUI

@Observable
class MaClasseObservable {

  
  @ObservationIgnored
  private var uneProprieteObjet = UneClasse()

  var valeur: Double = 0.0
  var message: String = ""
  ...
}

Utiliser un objet observable dans une vue

Pour qu'une vue réagisse aux changements d'un objet observable, il faut déclarer cet objet avec @State. C'est le combinaison de @Observable sur la classe et de @State sur la variable qui rend la vue réactive.

SwiftUI

struct ContentView: View {
  @State private var objetDeMaClasseObservable: MaClasseObservable = MaClasseObservable()

  var body: some View {
    VStack {
      // la vue sera rafraîchie dès qu'une propriété observable accédée dans le body change
      Text("Valeur: \(objetDeMaClasseObservable.valeur)")   
      Text("Message: \(objetDeMaClasseObservable.message)")
    }
  }
}

Note : il est aussi possible d'utiliser @Bindable plutôt que @State afin de permettre à la vue enfant de modifier la variable (liaison bidirectionnelle).

Avant iOS 17

La macro @Observable n'existe que depuis iOS 17, sorti en septembre 2023.

Auparavant, le mécanisme d'observation était réalisé à l'aide de ObservableObject,@Published et @StateObject.

L'ancien mécanisme fonctionne toujours mais lorsqu'on développe pour iOS 17 ou plus récent, on préférera travailler avec la macro @Observable puisqu'elle est plus simple à mettre en oeuvre. De plus, @Observable est plus performant grâce à la compilation des macros.

Pour plus d'information

« Migrating from the Observable Object protocol to the Observable macro ». Apple. https://developer.apple.com/documentation/swiftui/migrating-from-the-observable-object-protocol-to-the-observable-macro

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre