Mis à jour le lundi 30 octobre 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 !

Les protocoles

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

Un protocole sert à définir un plan minimal que doit suivre une classe. C’est en quelque sorte un modèle pour votre classe. La particularité ici est qu’elle ne fournit pas l’implémentation de vos méthodes (le contenu). On écrit juste les méthodes sans décrire ce qu’elles vont réellement faire au final. Dans un protocole, cela n’est pas notre but.

Tout seul, un protocole ne sert strictement à rien. En effet, chaque protocole est destiné à être implémenté par une classe qui devra implémenter les méthodes du protocole. Et cette fois-ci, le contenu de vos méthodes seront écrites. Un protocole ne doit pas être confondu avec l’héritage. Un chien est un animal. Une voiture est un véhicule. Mais un animal n’est pas un véhicule. Pourtant, les deux peuvent se déplacer : c’est là qu’interviennent les protocoles.

Pour une classe qui a implémenté un protocole, on dit que la classe est conforme au protocole. 

Créer un protocole

La déclaration d’un protocole est identique à une classe si ce n’est que le mot-clé change. On n’utilisera pas ici le mot-cléclass, mais le mot-cléprotocol

Voici un exemple de déclaration d’un protocole :

protocol NomDeMonProtocole {

}

Remplacez bien sûrNomDeMonProtocole par le nom que vous souhaitez lui fournir. Il n’y a pas de convention spéciale pour nommer un protocole. Il respecte toutefois la même convention de nommage que les classes, c’est-à-dire qu’on fait débuter le nom par une majuscule. De même, il est judicieux de créer un nouveau fichier pour chaque nouveau protocole.

Par exemple, voici un protocole pour un chien :

protocol ProtocoleAnimal {
    func cri() // Le cri de l'animal
    func seDeplace() // Le déplacement de l'animal
}

Vous voyez qu’ici, nous n’avons pas défini le contenu de nos méthodes, nous n’avons pas dit ce qu’elles vont réaliser. Nous avons juste écrit la première ligne d’une fonction, sans les accolades. Cette première ligne, comme vous pouvez le voir dans l’exemple ci-dessus, est ce qu’on appelle une signature. Seules les signatures de vos méthodes seront donc écrites dans votre protocole.

Utiliser un protocole

Toute classe implémentant un protocole doit implémenter les méthodes de ce même protocole en respectant la signature. Si on prend l’exemple ci-dessus avec leProtocoleAnimal, alors on devra implémenter les méthodescri() etseDeplace() et indiquer leurs contenus. 

Pour préciser à une classe qu’elle doit implémenter un protocole, on le fait de la même façon que pour l’héritage grâce aux deux points:.

class Animal : ProtocoleAnimal {
    func seDeplacer() {
        // Instructions
    }

    func cri() {
        // Instructions
    }
}

On peut maintenant dire que la classeAnimal est conforme au protocoleProtocoleAnimal. Remarquez que si vous n’implémentez pas les méthodes du protocole, alors Xcode vous retournera une erreur, disant que votre classe n’est pas conforme au protocole précisé. L’erreur sera la même si vous oubliez ne serait-ce qu’une méthode.

Il est possible d’imposer à une classe de se conformer à plusieurs protocoles à la fois. Pour cela, il suffit de séparer les protocoles par des virgules dans de la définition de votre classe.

class Animal : ProtocoleAnimal1, ProtocoleAnimal2, ... {
    
    // …
    
}

L’héritage et hériter ses protocoles

Une classe peut à la fois hériter d’une classe et se conformer à un ou plusieurs protocoles. Pour réaliser cela, après le deux-points, en premier on met la classe à hériter, ensuite on indique le ou les protocole(s).

class Chien : Animal, ProtocoleAnimal1, ProtocoleAnimal2 {

}

Si la classe à hériter n’est pas indiquée en premier, Xcode vous le signalera de toute façon. ;)

Une autre chose que l’on peut aussi réaliser, c’est de faire hériter un protocole d’un autre protocole. Cela marchera de la même façon que l’héritage de classe. Il suffit d’essayer :

protocol ProtocoleAnimal1 {
    func cri() // Le cri de l'animal
    func seDeplace() // Le déplacement de l'animal
}
protocol ProtocoleAnimal2 : ProtocoleAnimal1 {

}

Dans cet exemple, on indique queProtocoleAnimal2 doit reprendre le même plan queProtocoleAnimal1. Vous pourrez dans ce dernier ajouter de nouvelles signatures. Maintenant testez ce code :

class Animal : ProtocoleAnimal2 {

}

Et vous verrez que Xcode vous signalera que votre classeAnimal ne respecte pas le protocoleProtocoleAnimal1, c’est normal. Vous n’avez pas implémenté les méthodes de ce protocole. 

N’oubliez pas que de cette façon, si vous souhaitez qu’une classe soit conforme auProtocoleAnimal2, vous devez implémenter les méthodes deProtocoleAnimal1 ET deProtocoleAnimal2.

Pour résumer

  • Un protocole est en quelque sorte un modèle/un plan pour votre classe.

  • On peut demander à une classe qu’elle soit conforme à plusieurs protocoles à la fois.

  • Si on veut qu’une classe hérite d’une autre et qu’elle soit conforme à des protocoles, on écrit en premier la classe à hériter.

 

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