Mis à jour le 30/10/2017
  • 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

J'ai tout compris !

Exploitez vos propriétés

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Jusqu’à présent, les propriétés que nous avons utilisés étaient ce qu’on appelle des propriétés stockées (stores properties en anglais). Dans ce chapitre, je vais vous montrer l’utilisation des propriétés calculées qui vous nous permettre d'aller un peu plus loin avec les propriétés.

get et set

Pour exemple, je vais prendre une classe  Personne  qu’on va simplifier.

class Personne {
    var nom: String
    var prenom: String
    
    init(nom: String, prenom: String) {
        self.nom = nom
        self.prenom = prenom
    }
}
 
var personne = Personne(nom: "Dupont", prenom: "Jean")

Une utilité d’utiliser une propriété calculée ici serait par exemple de disposer d’une propriété comportant le nom complet (prénom + nom). Mais vous entendez bien que modifier le nom complet à chaque fois que l’on modifie un nom ou un prénom, c’est un peu lourd. Et bien, sachez qu’il est possible d’automatiser tout cela.

Tout d’abord, je vais vous parler de propriété dite en lecture seule. En lecture seule ça veut dire que dans votre code, quand vous utiliserez cette propriété, vous ne pourrez que lire sa valeur sans jamais pouvoir la modifier.

class Personne {
    var nom: String
    var prenom: String
    
    var nomComplet: String {
        get {
            return self.prenom + " " + self.nom
        }
    }
    
    init(nom: String, prenom: String) {
        self.nom = nom
        self.prenom = prenom
    }
}
 
var personne = Personne(nom: "Dupont", prenom: "Jean")
print(personne.nomComplet)

Vous voyez que pour cela, j'ai ajouté ma nouvelle propriété comme habituellement. Sauf que j'y ai ajouté des accolades pour mettre au sein de cette propriété notre bloc  get {}  . Ce  get  veut dire que lorsque l'on souhaite lire la valeur de cette propriété, tu fais ce qui est dans le bloc  get  . A savoir ici, tu retournes la valeur concaténé de  prenom  et  nom  . Vous pouvez remarquer que le  print()  affiche correctement le nom sans que nous ayons eu besoin de faire quoi que ce soit pour la propriété  nomComplet  .

Maintenant, essayons de modifier le nom pour voir si cela se répercute bien sur le  nomComplet  :

var personne = Personne(nom: "Dupont", prenom: "Jean")
print(personne.nomComplet)
personne.nom = "Durand"
print(personne.nomComplet)
Jean Dupont
Jean Durand

 La répercussion se fait correctement.

Maintenant, il serait intéressant que lorsque l'on change le nom complet cette fois-ci, cela change aussi le nom et prénom. Comme cette propriété est en lecture seule, il nous est interdit de le faire. Pour pouvoir modifier la propriété, il nous faut ajouter le bloc  set  à la suite du bloc  get  .

Pour modifier cette valeur, il faut modifier la valeur de  nom  et  prenom  pour que le  get  puisse nous donner la valeur que l'on souhaitait. Comprenez par là que le  set  ne stocke pas la valeur que nous avons passée. Pour notre exemple, nous allons dire que dans un nom complet, il n'y a qu'un seul espace. Le premier mot de la chaine de caractère sera alors le prénom et le dernier mot sera alors le nom. C'est en splitant cette chaine de caractère que nous allons venir modifier les propriétés  nom  et  prenom  afin que le  get  nous retourne ce que l'on souhaite.

// Pour l'exemple, nous avons besoin d'importer ce module Foundation
// pour splitter le nom complet en deux parties
import Foundation
 
class Personne {
    var nom: String
    var prenom: String
    
    var nomComplet: String {
        get {
            return self.prenom + " " + self.nom
        }
        set {
            let split = newValue.components(separatedBy: " ")
            self.prenom = split.first!
            self.nom = split.last!
        }
    }
    
    init(nom: String, prenom: String) {
        self.nom = nom
        self.prenom = prenom
    }
}
 
var personne = Personne(nom: "Dupont", prenom: "Jean")
print(personne.nomComplet)
personne.nomComplet = "Jeanne Durand"
print(personne.nomComplet)

Quoi de nouveau ici ? Tout d’abord, l’apparition de  newValue  . Dans cette variable, nous récupérons en fait ce que nous avons passé comme valeur lors de l’affectation de la variable  nomComplet  . On se sert ensuite de cette valeur pour la splitter en deux grâce à la méthode  components(separatedBy:)  . Une fois que nous avons nos deux valeurs, il nous reste plus qu’à modifier nos propriétés prénom et nom directement. Le  get  se chargera tout seul de nous retourner la nouvelle valeur par la suite.

willSet et didSet

En Swift, il existe un moyen d’observer nos propriétés. En l’occurence ici, cela veut dire que l’on va pouvoir jouer sur nos propriétés avant qu’elles ne soient modifiées ou après qu’elles soient modifiés.

Pour pouvoir modifier une propriété avant qu’elle soit modifié, nous allons nous servir de  willSet  .
Pour pouvoir modifier une propriété après qu’elle soit modifié, nous allons nous servir de  didSet  .

Quant à leurs utilisations, on va agir de la même manière que pour  get  et  set  . Le nom de vos blocs seront tout simplement  willSet  et  didSet  .

Avec  willSet  , nous récupérerons la nouvelle valeur de la propriété au sein de la variable  newValue  .
Avec  didSet  , nous récupérerons l’ancienne valeur de la propriété au sein de la variable  oldValue  .

class Personne {
    var nom: String {
        willSet {
            print("Le nom est " + self.nom + " et va devenir " + newValue)
        }
        didSet {
            print("Le nom était " + oldValue + " et est devenu " + self.nom)
        }
    }
    
    init(nom: String) {
        self.nom = nom
    }
}
 
var personne = Personne(nom: "Dupont")
personne.nom = "Durand"

Pour résumer

  • get  sert à fournir la valeur de la propriété selon le retour qu’on lui aura proposé. Un  get  seul dans une propriété calculée rend la propriété en lecture seule

  • set  permet de pouvoir modifier des propriétés afin de pouvoir modifier indirectement la propriété calculée

  • willSet  permet d’effectuer des actions avant que la propriété observée soit modifiée

  • didSet  permet d’effectuer des actions après que la propriété observée soit modifiée

Exemple de certificat de réussite
Exemple de certificat de réussite