La gestion efficace des données est un élément clé pour le succès de toute application iOS.

Avec Swift, nous disposons de nombreuses options pour stocker et manipuler les données. Et grâce à SwiftUI, la gestion des données devient encore plus simple et efficace ! En effet, SwiftUI utilise une approche déclarative qui permet de mettre à jour automatiquement les parties de l’interface utilisateur concernées lorsque les données changent. Ces mises à jour se font à la suite d’une action de l’utilisateur ou d’un événement externe.

Cela nous permet donc de nous concentrer sur la logique de notre application plutôt que sur la mise à jour manuelle de l’interface.

Dans cet article, nous allons explorer les bases de la gestion des données avec SwiftUI.

@State

@State est une propriété que nous ajoutons devant la déclaration d’une variable. Elle indique que le changement de valeur de la variable va entraîner une modification des données de l’application.

struct ContentView: View {
    struct ToggleState {
        var isOn: Bool = false
    }

    @State private var toggleState = ToggleState()
    
    var body: some View {
        Toggle("Toggle 1", isOn: $toggleState.isOn)
    }
}

Par exemple, ici nous créons un « bouton toggle », qui pourra être soit on, soit off.

L’attribut @State signifie que la valeur de toggleState peut être modifiée dans la vue, et que la vue est automatiquement rafraîchie chaque fois que toggleState change.

La vue contient simplement un Toggle qui affiche le texte « Toggle 1 » et est lié à la variable isOn de toggleState à l’aide de la syntaxe $toggleState.isOn. Cela signifie que lorsque l’utilisateur active ou désactive le Toggle, la variable isOn est mise à jour automatiquement.

On pourrait imaginer par la suite un changement de couleur du texte en fonction de la valeur de isOn.

Attention, on ne peut utiliser @State qu’avec des structures ! Dès lors qu’on utilise une classe, l’application crashe.

Souviens toi, une structure est un type de valeur. C’est à dire que la valeur, lorsqu’elle a été copiée dans une nouvelle variable, ne pourra pas changer. Elle sera unique et comme « recréée » à chaque changement d’état.

struct ToggleState {
    var isOn: Bool = false
}

Le gros inconvénient de @State est qu’elle est uniquement disponible dans sa propre vue.

• @StateObject

@StateObject permet de gérer l’état d’un objet à long terme dans une vue. Cette propriété ne nécessite pas que l’objet soit passé à l’extérieur de la vue, et n’est pas destiné à être partagé avec d’autres vues.

Lorsqu’une vue utilise StateObject, SwiftUI crée automatiquement une instance de cet objet et la stocke dans la mémoire à long terme pour la durée de vie de la vue. La vue peut ensuite utiliser l’objet pour stocker et gérer son propre état.

class UserSettings: ObservableObject {
    @Published var isDarkModeEnabled = false
}

struct ContentView: View {
    @StateObject var userSettings = UserSettings()

    var body: some View {
        Toggle("Dark Mode", isOn: $userSettings.isDarkModeEnabled)
    }
}

Ici, la vue La vue peut utiliser userSettings pour stocker et gérer l’état de la préférence de l’utilisateur.

@Binding

@Binding nous permet de partager la valeur d’une variable à travers différentes vues. Cela permet de partager l’état entre plusieurs vues et de garantir que les modifications apportées à l’état sont reflétées dans toutes les vues concernées.

struct ParentView: View {
    @State private var isOn = false
    
    var body: some View {
        ChildView(isOn: $isOn)
    }
}

struct ChildView: View {
    @Binding var isOn: Bool
    
    var body: some View {
        Toggle("Toggle", isOn: $isOn)
    }
}

La syntaxe $isOn crée une liaison entre isOn dans ParentView et isOn dans ChildView.

Lorsque l’utilisateur active ou désactive le Toggle dans ChildView, la valeur de isOn est mise à jour dans ParentView, ce qui entraîne une mise à jour automatique de l’interface utilisateur dans les deux vues.

La valeur d’une variable dans une vue est directement liée à la valeur d’une variable dans une autre vue.

@EnvironmentObject & @Observed Object

  • @EnvironmentObject est conçu pour que les types de référence soient partagés entre de nombreuses vues.

C’est à dire que si tu as besoin de faire transiter des informations d’une vue à l’autre, tu peux l’utiliser. Elle est très utile quand tu as besoin de passer beaucoup de données dans ton application. Comme ça, il n’y a aucun risque de désynchroniser les différentes parties de ton application.

Lorsqu’une vue utilise @EnvironmentObject, SwiftUI recherche automatiquement l’objet dans l’environnement de la vue parente la plus proche qui en a une instance et l’utilise.

  • @ObservedObject surveille les modifications d’un objet au sein de sa vue.

Cela signifie que la propriété ObservedObject doit être initialisée à l’intérieur de la vue, et que la vue elle-même est responsable de la gestion de cet objet. Cela permet à la vue de rester synchronisée avec les changements dans l’objet observable.

class DataModel: ObservableObject {
    @Published var name = "Pomme"
    @Published var isEnabled = false
}

struct MyView: View {
    @StateObject private var model = DataModel()

    var body: some View {
        Text(model.name)
        MySubView(model: model)
    }
}

struct MySubView: View {
    @ObservedObject var model: DataModel // Surveille les modifications de DataModel

    var body: some View {
        Toggle("Enabled", isOn: $model.isEnabled)
    }
}

Pour résumer

  • @State: à utiliser pour les propriétés simples qui appartiennent à une seule vue.
  • @StateObject : à utiliser une fois pour chaque objet observable que tu utilises, là où il est créé.
  • @ObservedObject : à utiliser pour les propriétés complexes qui peuvent appartenir à plusieurs vues.
  • @EnvironmentObject : à utiliser pour les propriétés créées ailleurs dans l’application comme que les données partagées.


Je suis sûre que tu n’en as pas eu assez alors voilà un peu de documentation officielle sur l’ObservedObject ou l’EnvironmentObject. Je sais, c’est un peu barbant mais ça aide à comprendre !

Si tu as aimé cet article, partage le 🫶