• 12 hours
  • Hard

Free online content available in this course.

course.header.alt.is_video

course.header.alt.is_certifying

Got it!

Last updated on 3/22/24

Implémentez UserDefaults

Maintenant que vous savez tout sur les UserDefaults, on va jouer un peu avec ! Dans ce chapitre, on va sauvegarder la monnaie sélectionnée par l'utilisateur dans les UserDefaults, et ensuite la récupérer pour l'afficher.

Créez une instance de UserDefaults

La sauvegarde va avoir lieu dès qu'on modifie la monnaie. Cela a lieu dans SettingsViewController  avec la méthode changeCurrency  :

@IBAction func changeCurrency(_ sender: UIButton) {
   guard let currency = sender.titleLabel?.text else { return }
   currencyLabel.text = currency

   // TODO: Save currency
}

Et comme vous pouvez le voir, cette méthode est incomplète. Ce ne sera plus le cas dans quelques minutes !

UserDefaults est une classe : UserDefaults  . Pour l'utiliser, il nous faut une instance. Vous pouvez créer une instance de UserDefaults  , mais, en pratique, vous utiliserez presque toujours standard  : une propriété statique de UserDefaults  de type UserDefaults  . Donc toutes vos manipulations de UserDefaults vont commencer comme ceci :

UserDefaults.standard

Sauvegardez des données

Maintenant qu'on a une instance, on va pouvoir utiliser les méthodes que nous avons vues ensemble dans le chapitre précédent. Pour sauvegarder notre monnaie, nous allons utiliser la méthode  set(Any?, forKey: String)   comme ceci :

UserDefaults.standard.set(currency, forKey: "currency")

Je sauvegarde mon objet currency  avec la clé currency. J'utiliserai cette clé ensuite pour récupérer mon objet.

Voilà ce que donne le code complet de notre méthode changeCurrency  :

@IBAction func changeCurrency(_ sender: UIButton) {
   guard let currency = sender.titleLabel?.text else { return }
   currencyLabel.text = currency
   UserDefaults.standard.set(currency, forKey: "currency")
}

Récupérez un objet

Nous avons sauvegardé la monnaie préférée de notre utilisateur ! Mais pour l'instant, on n'en fait rien. Nous allons récupérer cette information pour l'afficher à deux endroits :

  1. Dans le label de l'interface de SettingsViewController, pour que lorsque cette interface apparaît, elle affiche directement la monnaie sélectionnée.

  2. Dans la liste des dépenses (ListViewController), pour que le montant de chaque dépense s'affiche dans la bonne monnaie.

SettingsViewController

On va récupérer la monnaie depuis les UserDefaults au chargement de la vue, donc dans la méthode viewDidLoad. Pour cela, on va utiliser la méthode dont on a parlé au chapitre précédent,  object(forKey: String) -> Any?   :

override func viewDidLoad() {
   super.viewDidLoad()
     let currency = UserDefaults.standard.object(forKey: "currency") as? String
   currencyLabel.text = currency
}

Je récupère mon objet en utilisant ma clé currency définie précédemment. Comme la méthode object(forKey:)  renvoie un type Any?, je contrôle son type pour m'assurer qu'il s'agit bien d'une String.

Ensuite, je mets à jour mon label avec la monnaie récupérée.

ListViewController

On va faire la même chose dans notre liste de dépenses en mettant à jour la méthode suivante :

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: "SpendingCell", for: indexPath)

   let spending = SpendingService.shared.spendings[indexPath.row]
   cell.textLabel?.text = spending.content
     cell.detailTextLabel?.text = "\(spending.amount) €" // Ici, on va changer la monnaie.

   return cell
}

Cette fois-ci, on va utiliser une des variantes de  object(forkey:)  :   string(forkey:) . Cette version fonctionne exactement de la même manière, mais a l'avantage de renvoyer directement un objet de type String?. Cela nous évite de faire le contrôle de type.

Voilà ce que ça donne :

let currency = UserDefaults.standard.string(forKey: "currency") ?? "€"
cell.detailTextLabel?.text = "\(spending.amount) \(currency)"

Et voilà ! Vous pouvez tester ! Désormais, la monnaie choisie par l'utilisateur est présente partout dans l'application.

En résumé

  • On utilise la plupart du temps l'instance standard  de la classe UserDefaults.

  • Il existe plusieurs variantes de  object(forKey:)   qui permettent d'éviter le contrôle de type.

Dans le prochain chapitre, nous allons refactoriser notre code parce que, je ne sais pas pour vous, mais moi il y a un ou deux trucs qui me brûlent les yeux !

Example of certificate of achievement
Example of certificate of achievement