Astuce pour enregistrer/récupérer des données dans UserDefaults en Swift

UserDefaults (ou NSUserDefaults pour Swift2.3 et inférieur) est utilisé pour enregistrer les types de données simples sans se soucier du chemin ou du nom de fichier par exemple, des scores pour un jeu, des préférences du genre utilisateur connecter ou pas. Par contre quand vous avez des relations complexes entre les classes de modèles de votre application je vous conseille d’utiliser coreData ou Realm.

Pour enregistrer ou récupérer des données dans UserDefaults vous devrez associer chaque données (bool, string, objet ..) à une clé, par exemple une fois que l’utilisateur se connecte dans l’application je vais enregistrer la valeur true dans la clé isUserCoonected :

ensuite, dans l’appDelegate (ou autre si vous affichez une autre interface après le splashScreen), je vais récupérer la valeur de la clé isUserConnected pour afficher l’interface du login si l’utilisateur n’est pas connecté :

Comme vous pouvez le voir, j’ai dupliqué l’utilisation de isUserConnected à la fois pour enregistrer et récupérer la valeur, ce serait plus difficile si un jour je voudrais changer le nom de la clé, je serais obligé de le faire dans deux emplacements différents.

Pour améliorer le code, je vais commencer par déclarer isUserConnected comme une constante globale et utiliser cette constante à la fois pour enregistrer et récupérer :

Mais en Swift il existe une meilleure astuce pour ne pas utiliser des constantes pour chaque données, nous allons utiliser le macro #function (__FUNCTION__ en objective-c) qui dans ce cas va contenir le nom de la variable et donc nous allons avoir une clé unique puisque le compilateur ne nous permet pas de déclarer deux variables avec le nom :

Finalement, voici comment vous pouvez utiliser la variable isUserConnected dans l’application :

N’hésitez pas à m’envoyer un message sur twitter si vous avez une meilleure idée ou simplement pour poser vos questions.

Show your support

Clapping shows how much you appreciated Mohamed Ghebaji’s story.