• 20 hours
  • Medium

Free online content available in this course.

course.header.alt.is_video

course.header.alt.is_certifying

Got it!

Last updated on 2/1/19

Initialisez les classes

Log in or subscribe for free to enjoy all this course has to offer!

Nous avons maintenant des classes qui contiennent des propriétés. Nos classes permettent donc de stocker de l'information. Mais je ne suis pas tout à fait satisfait de nos propriétés pour l'instant.

Pourquoi ?

Et bien, car elles ont toutes des valeurs par défaut et parfois ça n'a pas vraiment de sens. Prenons par exemple la propriété driverName. Ce n'est pas logique que le nom du chauffeur soit par défaut Joe, il n'y a aucune statistique à ma connaissance qui le justifie...

Propriétés non initialisées

Essayons donc de supprimer la valeur par défaut. Pour cela, je vais donc remplacer la déclaration de la propriété en supprimant l'initialisation de celle-ci :

var driverName: String

À ce moment-là, on a une erreur qui dit :

error: class 'Bus' has no initializers

Qu'est-ce que ça veut dire ? Pour bien comprendre, imaginons que l'on va créer une instance de la classe Bus. Lorsque l'on fait ça, le programme va regarder toutes les propriétés de la classe Bus et créer autant de variables correspondantes. Toutes ces variables vont être mises dans un petit paquet et on a notre instance ! Mais lorsque l'on crée une instance, on crée autant de variables qu'il y a de propriétés. Et toutes ces variables doivent être prêtes à l'emploi. Pas de souci pour celles qui ont des valeurs par défaut. Mais quand le programme va vouloir créer la variable driverName, il ne saura pas quelle valeur lui attribuer.

Pas grave, il n'a qu'à ne pas lui mettre de valeur !

C'est filou ! Mais quel est le type de notre variable ?

String...

En effet, donc cette variable n'est pas optionnelle alors on ne peut pas l'utiliser sans valeur. Le programme va planter.

OK... Mais quel rapport avec l'erreur affichée ?

Le rapport, c'est que pour résoudre ce problème nous avons 2 solutions :

  • Soit je déclare ma variable driverName optionnelle et tout ira bien.

    var driverName: String?

    La variable a le droit maintenant de ne pas avoir de valeur. A priori, ça vous connaissez.

  • Soit j'utilise ce qu'on appelle un initialiseur dans lequel je vais... initialiser ma variable ! Là par contre, c'est nouveau ! Alors, laissez-moi vous montrer !

L'initialisation d'une classe

Tout d'abord, qu'est-ce qu'un initialiseur ? C'est une fonction qui va être appelée au moment de la création d'une instance de classe et dans laquelle on peut faire quelques calculs pour initialiser nos propriétés. On crée cette fonction à l'intérieur de la classe en utilisant le mot clé init :

init() {
    // Ici on peut initialiser nos propriétés
}

Par exemple, dans le cas de notre classe Bus, on va pouvoir écrire :

init() {
    driverName = "Joe"
}

Et voilà ! Nous n'avons plus d'erreur ! Vous pouvez tester en créant une instance, la propriété driverName aura pour valeur Joe.

Oui enfin il n'y a pas de quoi sauter au plafond...

Bah pourquoi ?

On a fait que déplacer le problème. La propriété driverName a toujours une valeur par défaut...

Hmm... Bien vu ! Mais vous ne m'aurez pas aussi facilement !

L'initialisation avec paramètres

Je vous ai dit que l'initialiseur, c'était une fonction. Et bien comme toute fonction, elle peut avoir des paramètres ! On peut par exemple écrire :

init(name: String) {
        driverName = name
}

Et maintenant, pour instancier un bus, on va écrire :

var unBus = Bus(name: "Jean")

L'initialisation du bus a changé ! Maintenant Swift exige que nous passions des paramètres pour instancier un nouveau bus. Et de cette façon, on peut choisir pour chaque nouvelle instance du bus, le nom du chauffeur. Alors, heureux·se ?

Le mot-clé "self"

Notre initialisation a désormais un paramètre qui s'appelle name. C'est bien, mais ce n'est pas parfait. Pour que l'initialisation soit claire, en général, on préfère donner comme nom de paramètre, le nom exact de la propriété soit ici driverName. Alors, modifions ça :

init(driverName: String) {
    driverName = driverName
}

Patatras ! Nous avons une erreur. L'erreur vient du fait que nous avons deux fois driverName et l'ordinateur ne sait plus si on parle de la propriété ou du paramètre. Heureusement, nous avons le vaillant mot clé self à notre secours !

Euh... quoi ?

Le mot-cléselfpermet dans une classe de faire référence à elle-même. Le plus simple, c'est que je vous montre :

init(driverName: String) {
    self.driverName = driverName
}

self se comporte comme une instance de la classe dans laquelle il est écrit. Donc quand j'écris self.driverName à l'intérieur de la classe Bus, je fais référence à la propriété driverName de la classe Bus.

En écrivant ceci, Swift sait maintenant que self.driverName, c'est la propriété et driverName après le =, c'est le paramètre.

Voilà, nous avons désormais un initialiseur bien pratique pour notre classe Bus !

Exercice

Comme je suis généreux, je vous propose non pas 1, ni 2, mais bien 3 exercices ! Woooohouuu ! Les corrections sont plus bas.

1. Ajoutez un initialiseur à la classe RoadSection
Cette classe est vide pour le moment, rajoutez-lui un initialiseur qui va appeler la fonction canvas.createRoadSection() de sorte qu'à chaque fois qu'on crée une nouvelle instance de RoadSection, une section de route est ajoutée sur le canevas.

2. Ajoutez un initialiseur à la classe Road
Ajoutez un initialiseur la classe Road qui prend pour paramètre length qui est un entier et qui détermine la taille de la route. Cet initialiseur permet de remplir le tableau des sections de route d'autant de sections qu'indiqué par le paramètre length.

3. Ajoutez un initialiseur à la classe Personne

Entraînez-vous avec cet exercice !

Corrections de 1 et 2

// Exerice 1
class RoadSection {
    init() {
        canvas.createRoadSection()
    }
}

// Exercice 2
class Road {
    var sections = [RoadSection]()

    init(length: Int) {
        for _ in 0..<length {
            self.sections.append(RoadSection())
        }
    }
}

var road = Road(length: 20) // Vous devriez voir une route de 20 sections se dessiner sur le canevas.

En résumé

  • Pour utiliser des propriétés sans valeur par défaut, on peut :

    • leur donner un type optionnel : la propriété pourra ne pas avoir de valeur

    • utiliser un initialiseur

  • Un initialiseur est une fonction qui est appelée lors de la création d'une instance. Pour créer un initialiseur, on utilise le mot-clé init. Comme toute fonction, un initialiseur peut avoir des paramètres.

  • Le mot-clé self fait référence à la classe dans laquelle il est appelé. Il s'utilise comme une instance de la classe.

Example of certificate of achievement
Example of certificate of achievement