Struct et Class - SwiftUI

Salut a tous,

J’ai un problème de comprehension avec les Structs et les Classes (ou comment bien les utiliser).

Je voudrais enregistrer quelques paramètres de l’utilisateur de mon application, comme le nickname et le score par exemple.

struct User {
var userName: String?
var score: Int?
}

Faut-il utiliser une Classe ou une Structure pour pouvoir changer la valeur du score sans pour autant créer a chaque fois une nouvelle instance ?

J’ai créé ma variable user dans la vue principale (ou est déclarée la TabView) :

@State var user: User

Puis j’appelle leur valeur dans chaque page en utilisant :

@Binding var user: User

Est-ce bien comme ça que l’on doit faire ?

Dernière question sur la portabilité de la variable :

A quel moment la valeur est perdue ? Au moment de la mise en arrière plan de l’app, de sa fermeture complete (kill) ou de sa désinstallation ?

Bref - la question serait plutôt « A quel moment doit-on enregistrer la variable dans UserDefaults ou la database pour être sur que l’utilisateur ne perde pas sa progression ? »

Salut Cedric,

ce sont pleins d’excellentes questions et la plupart trouverons des réponses dans le cours que je vais bientôt sortir (certaines ont déjà une réponse dans les chapitres que j’ai enregistré aujourd’hui mais que je dois encore monter :stuck_out_tongue:).

Pour te donner une première piste de réflexion :
utilise au maximum des struct avec SwiftUI pour tes données d’état de l’interface graphique. Les struct sont plus performants mais un peu plus difficiles à utiliser en général.
Ta logique est bonne d’utiliser @State dans la vue qui possède la variable, et @Binding dans les vues qui doivent avoir accès à la variable en écriture. Si par contre les vues enfant ne font qu’afficher la valeur sans la modifier, alors il vaut mieux utiliser let user:User dans ces vues et te passer du @Binding.

Les variables créées dans les vues disparaissent quand les vues qui les possèdent sont supprimées, donc pour répondre à ta question, c’est principalement quand l’app est vraiment quittée (kill ou en arrière plan pendant suffisamment longtemps).

Si possible sauvegarde tes données dès qu’elles sont modifiées, car il n’y a pas de fonctions quitter sur iOS. Part du principe que ton app peut être kill à tout moment et que tu dois avoir sauvegardé toute infos que tu ne peux pas recréer au lancement

1 « J'aime »

Merci d’avoir répondu a mes questions… je vois que je suis donc sur la bonne voie !

Fais vite le montage - nous sommes tous très impatients !! :sweat_smile:

Je pensais explorer applicationWillResignActive et applicationWillTerminate mais je vais donc plutôt gérer ca dans mon LocalStorage alors:

class LocalStorageService {

    static func saveUser(username:String? = nil, score:Int? = nil) {
        
        let defaults = UserDefaults.standard
        if let username = username {
            defaults.set(username, forKey: "userName")
        }
        if let score = score {
            defaults.set(score, forKey: "score")
        }
    }
    
    static func loadUser() -> User? {
        
        let defaults = UserDefaults.standard
        let username = defaults.value(forKey: "userName") as? String
        let score = defaults.value(forKey: "score") as? Int

        return User(userName: username, score: score)
    }
    
    static func clearUser() -> Void {
        
        let defaults = UserDefaults.standard
        defaults.set(nil, forKey: "userName")
        defaults.set(nil, forKey: "score")
    }
}