• 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

Énumérez des cas

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

Pour aller plus loin, nous allons découvrir un nouveau modèle de donnée nommé ! En Swift, il existe trois modèles de données nommées :

  • Les classes

  • Les structures

  • Les énumérations

Ce cours fait la part belle aux classes : vous savez de quoi il s'agit.
Les structures ressemblent beaucoup aux classes et sont très utiles en Swift, mais nous ne verrons leur utilisation qu'au prochain cours sur iOS.
Et les énumérations, et bien c'est le sujet de ce chapitre !

Découvrez les énumérations

Comme les classes, les énumérations sont des modèles de donnée nommées. C'est-à-dire qu'ils vont nous permettre de modéliser nos données en définissant un nouveau type. C'est ce qu'on a fait avec nos classes jusqu'à présent. On a créé un modèle de données simple à comprendre avec trois nouveaux types : un bus, une route et des sections de route. Les énumérations ont une mission similaire, mais pour des usages un peu différents.

Le rôle d'une énumération est très simple : elle permet d'énumérer des cas. Et il y a plein de moments où c'est utile. Laissez-moi vous donner quelques exemples :

  1. Quand vous cherchez votre direction avec une boussole, il y a quatre cas possibles : nord, sud, est, ouest.

  2. Si vous attendez un enfant, il y a deux possibilités : c'est un garçon ou une fille.

  3. Si vous voulez présenter un message d’erreur à un utilisateur, vous pouvez définir plusieurs cas identifiables comme : vous n'êtes pas connecté, connexion internet faible ou vous n'avez pas l'autorisation.

Avec les énumérations, on va pouvoir nommer tous ces cas. En reprenant les exemples précédents, cela donnerait :

  1. Type : Direction / Cas : nord, sud, est, ouest

  2. Type : Sexe / Cas : garçon, fille

  3. Type : Erreur / Cas : non connecté, signal faible, non autorisé

On a donc un type générique qui contient différents cas. Sans plus attendre, je vous propose de vous montrer tout de suite comment déclarer ces 3 énumérations en Swift :

// 1
enum Direction {
    case nord
    case sud
    case est
    case ouest
}

// 2
enum Sexe {
    case garçon
    case fille
}

// 3
enum Erreur {
    case nonConnecté
    case signalFaible
    case nonAutorisé
}

Comme vous pouvez le constater, cela ressemble aux déclarations de classe. Ici on a le mot-clé enum qui permet de déclarer l'énumération et ensuite le mot-clé case à l'intérieur qui permet à chaque fois d'ajouter un nouveau cas.

Utiliser les énumérations

Pour utiliser une énumération, on utilise le nom de l'énumération suivi du . suivi du nom du cas. Par exemple :

var erreurDeConnexion = Erreur.nonConnecté
var erreurDeConnexion = Erreur.nonConnecté
erreurDeConnexion = .signalFaible // Le type est connu grâce à la déclaration précédente

let dir: Direction = .nord // Le type est annoté

Enumération et switch

On utilise très souvent les énumérations avec les switch. C'est logique, car le switch est une structure de contrôle qui permet de naviguer entre plusieurs cas. C'est ce que nous allons faire ici avec nos types de sections de route. Tout d'abord, je vous propose de créer une énumération qui décrit nos trois types de sections de route :

enum RoadSectionType {
    case plain
    case home
    case school
}

Maintenant, nous allons pouvoir ajouter à notre classe RoadSection la propriété type :

class RoadSection {
    var type: RoadSectionType

    init() {
        canvas.createRoadSection()
    }
}

Nous allons désormais modifier notre init. Nous allons créer une initialisation qui prend en compte le paramètre type. Cela va nous permettre de dessiner sur le canevas la partie de route correspondant au type choisi :

init(type: RoadSectionType) {
        self.type = type
}

Rien de nouveau ici, j'utilise une initialisation avec paramètre comme on l'a vu dans les chapitres précédents. Je vais maintenant rajouter le switch :

init(type: RoadSectionType) {
    self.type = type
    switch type {
    case .plain:
        canvas.createRoadSection()
    case .home:
        canvas.createHomeRoadSection()
    case .school:
        canvas.createSchoolRoadSection()
    }
}

Plusieurs choses à noter :

  • Pour chaque cas, j'utilise la méthode appropriée du canevas pour dessiner la section.

  • Je fais le switch sur la variable type qui a pour type RoadSectionType. Je peux donc utiliser les cas directement avec le point sans rappeler RoadSectionType avant.

  • Le switch en Swift doit être exhaustif. Cela veut dire que tous les cas doivent être pris en compte dans un switch. C'est la raison pour laquelle vous avez systématiquement utilisé le mot-clé default jusqu'à présent qui permet de couvrir tous les autres cas. Ici, nous utilisons une énumération qui ne contient que trois cas. Nous couvrons ces trois cas avec le switch donc inutile d'utiliser default.

Avec cette nouvelle initialisation, nous pouvons maintenant créer facilement les sections de route du type de notre choix comme ceci :

RoadSection(type: .plain)
RoadSection(type: .home)
RoadSection(type: .school)

Dans le prochain chapitre, nous allons encore simplifier ceci avec l'héritage !

La vérité sur les optionnels !

Merci Barack pour le teaser...
Merci Barack pour le teaser...

En effet, je vais vous révéler la vérité sur les optionnels ! Vous êtes prêts ?

Les optionnels... sont... tout simplement... des... ÉNUMÉRATIONS ! Eh oui ! Laissez-moi vous montrer à quoi ils ressemblent :

enum Optional<T> {
    case none
    case some(T)
}

Donc un optionnel, c'est deux cas. Soit rien (none), soit quelque chose (d'un type précis). Et c'est exactement ce que vous connaissez des optionnels. Allons plus loin et jouons au jeu des équivalences :

Ces équivalences vous montrent des utilisations assez avancées des énumérations (notamment à cause de cette histoire de <T>;)). Ne vous arrêtez pas à ça et prenez juste le temps de comprendre le fait que les optionnels sont des énumérations et ce que cela veut dire concrètement.

J'espère que cela vous permettra de vous servir correctement des optionnels !

Les valeurs brutes

Jusqu'à présent nos énumérations sont des coquilles vides. Cela signifie qu'elles ne contiennent rien. Elles nous permettent de définir des cas, mais les cas ne contiennent pas de données. Sachez qu'en Swift, on peut associer à chaque cas une valeur. Reprenons un des exemples précédents :

enum Erreur {
    case nonConnecté
    case signalFaible
    case nonAutorisé
}

Cela pourrait être pratique que les cas contiennent un message d'erreur à afficher à notre utilisateur. Pour cela, nous allons préciser le type de la valeur brute contenue dans chaque cas et ensuite leur donner des valeurs. Voici la syntaxe :

enum Erreur: String {
    case nonConnecté = "Vous n'êtes pas connecté."
    case signalFaible = "Veuillez vérifier votre connexion internet."
    case nonAutorisé = "Vous n'êtes pas autorisé à effectuer cette action."
}

Je définis donc d'abord que la valeur brute a pour type String et ensuite je l'attribue à chacun des cas. Ensuite, pour l'obtenir, j'utilise la propriété rawValue.

let erreurDeConnexion = Erreur.nonConnecté.rawValue // Cela affiche "Vous n'êtes pas connecté."

Exercice

 Entraînez-vous avec cet exercice !

En résumé

  • Les énumérations, comme les classes et les structures, sont des modèles de données nommés.

  • Les énumérations permettent d'énumérer des cas.

  • La syntaxe de création d'une énumération est la suivante :

enum NomDeLEnumeration {
    case nomDuCas1
    case nomDuCas2
    case nomDuCas3
}
  • Pour utiliser une énumération, on utilise le nom de l'énumération suivi de . puis du nom du cas : NomDeLEnumeration.nomDuCas1.

  • On utilise très souvent les énumérations avec les switch.

  • Les optionnels sont des énumérations.

  • Les énumérations peuvent contenir des valeurs, appelées valeurs brutes. Ces valeurs doivent être du même type pour tous les cas d'une énumération. On les rajoute comme ceci :

enum NomDeLEnumeration: Type {
    case nomDuCas1 = valeurBrute1
    case nomDuCas2 = valeurBrute2
    case nomDuCas3 = valeurBrute3
}

La valeur brute est contenue dans la propriété rawValue.

Example of certificate of achievement
Example of certificate of achievement