Mis à jour le vendredi 27 janvier 2017
  • 15 heures
  • Facile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Ce cours existe en eBook.

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

J'ai tout compris !

Les conditions

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

Les conditions... Voici encore une nouvelle notion fondamentale ! En effet, vous serez très souvent amenés à utiliser des conditions dans votre programme Swift.

À quoi servent les conditions ? Vous verrez que vous aurez souvent besoin d'afficher ou d'exécuter certaines actions en fonction de certaines données. Exemple tout bête : si on a 18 ans ou plus alors on est majeur, sinon on est mineur. On réalise donc une condition sur l'âge pour savoir si la personne est majeure ou non.

Condition : if... else

Nous allons commencer par des conditions simples, à savoir :if... else  (en français si... sinon). Si on reprend l'exemple de l'intro, on a alors : si on a 18 ans ou plus alors on est majeur, sinon on est mineur.

Dans notre programme Swift, on va interpréter cela un peu différemment. Admettons que nous ayons défini une variable âge, alors on dira : si l'âge est supérieur ou égal à 18 alors on est majeur, sinon on est mineur. Cette fois-ci, nous avons tout simplement comparé l'âge pour définir si la personne est majeure ou non. Pour nos conditions, on utilisera des opérateurs de comparaison.

Qu'est-ce que des opérateurs de comparaison ?

Il s'agit d'éléments servant à comparer. Par exemple, si l'on veut comparer un nombre avec un autre, on pourra tester si le premier nombre est supérieur à l'autre. Ou bien, si les deux nombres sont identiques.

Avant de vous expliquer comment fonctionne la condition if... else , je vais lister quelques opérateurs de comparaison utiles pour la suite de cette partie. D'autres feront leurs apparitions plus bas.

Symbole

Signification

==

est égal à

>

est supérieur à

>=

est supérieur ou égal à

<

est inférieur à

<= 

est inférieur ou égal à

!=

est différent de

Condition qu'avec un if

Pour réaliser une condition en Swift, voici comment procéder par étapes.

  • On écrit le mot clé if.

  • On ajoute un espace et on introduit notre condition avec un opérateur de comparaison.

  • Enfin, on ouvre une accolade et on ferme une autre accolade. C'est entre ces deux accolades que l'on pourra exécuter ce qu'on souhaite uniquement pour notre condition.

Voici une condition :

let age = 20

if age >= 18 {
    print("Vous êtes majeur !")
    // Exécutez ici tout ce que vous voulez pour une personne majeure !
}

Et voilà ! 

if 20 >= 18 {
    print("20 est bien supérieur à 18 !")
}

Condition if... else

C'est bien beau tout ça, mais si on souhaite réaliser aussi des actions pour les personnes mineures, on fait un nouveauif avec cette fois-ci inférieur à 18 ?

Vous pouvez tout à fait faire ça ! J'explique :

  • Quand vous lancez votre programme Swift, le compilateur (celui qui va vous permettre d'exécuter votre fichier .swift) va d'abord regarder dans votre code la première condition.

  • Si la condition est vérifiée, alors il exécute tout ce qu'il y a entre accolade et poursuit son chemin dans le code. Sinon, par défaut, il ne fera rien et poursuivra tout de même son chemin dans le code.

  • Là, le compilateur tombe sur votre deuxième condition avec un if et effectue les mêmes actions que les points ci-dessus.

let age = 12

if age >= 18 {
    print("Vous êtes majeur !")
}

if age < 18 {
    print("Vous êtes mineur.")
}

Exécutez votre programme et vous verrez que la console vous affiche bien "Vous êtes mineur.". Il n'a pas pu entrer dans la première condition car 12 n'est pas supérieur ou égal à 18. En revanche, il a pu entrer dans la deuxième condition car 12 est bien inférieur à 18.

Il existe une autre méthode pour réaliser ceci. Si une personne n'est pas majeure, alors elle est forcément mineure. De ce fait, utiliser une nouvelle condition peut paraître lourd. C'est ici que j'introduis le else. Voici comment faire plus rapidement avec leelse  :

let age = 12

if age >= 18 {
    print("Vous êtes majeur !")
} else {
    print("Vous êtes mineur.")
}

Le résultat est exactement le même que l'exemple du dessus. Il est néanmoins plus rapide et surtout plus clair. Prononcez dans votre tête "Si l'âge est supérieur ou égal à 18 affiche ceci, si l'âge est inférieur à 18 affiche cela" et prononcez "Si l'âge est supérieur ou égal à 18 affiche ceci, sinon affiche cela". Quelle phrase vous paraît la plus simple à prononcer ? La deuxième bien évidemment.

De plus, avec cette façon de procéder, les modifications seront plus rapides. Imaginons que demain la majorité passe de 18 à 21 ans en France. Avec le premier exemple, il faudrait modifier à deux endroits dans votre code le chiffre 18 par 21. Avec le deuxième exemple, un seul endroit est à modifier.

Condition if... else if... else

Jusqu'à maintenant, avec notre condition, nous avions soit une chose, soit une autre. Mais pas plusieurs. Sachez qu'il est aussi possible de faire ça avec Swift avec cette fois-ci, le mot-clé else if. Ce mot-clé est à placer entreif etelse.

let age: Int = 18

if age >= 21 {
    print("Vous êtes majeur, et même aux Etat-Unis !")
} else if age >= 18 {
    print("Vous êtes majeur, mais pas aux Etat-Unis. :(")
} else {
    print("Vous êtes mineur.")
}

Vous avez ici réalisé deux conditions. Et si les deux conditions échouent, alors on exécute ce qu'il y a dans le else . Pour cet exemple, on regarde dans un premier temps si 18 est supérieur ou égal à 21, sinon on regarde si c'est supérieur ou égal à 18, sinon la personne est mineure. Le résultat affiché dans la console est bien entendu : "Vous êtes majeur, mais pas aux Etat-Unis. :( ".

Maintenant, j'aimerais porter votre attention sur cet exemple :

let age: Int = 32

if age >= 21 {
    print("Vous êtes majeur, et même aux Etat-Unis !")
}

if age >= 18 {
    print("Vous êtes majeur, mais pas aux Etat-Unis. :(")
}

Après exécution, la console retourne ceci :

Vous êtes majeur, et même aux Etat-Unis !
Vous êtes majeur, mais pas aux Etat-Unis. :(

Il n'y a pas d'erreur : 32 est bien supérieur à 21 et 32 est bien supérieur à 18. Les deux phrases vont donc s'afficher ! En utilisantelse if, dès qu'une condition est remplie, elle exécute ce qu'elle a à faire, et ne va plus s'occuper d'aller dans les autreselse if  ouelse.

Dernière chose sur laquelle j'aimerais encore porter votre attention pour cette section :

let age: Int = 32

if age >= 18 {
    print("Vous êtes majeur, mais pas aux Etat-Unis. :(")
} else if age >= 21 {
    print("Vous êtes majeur, et même aux Etat-Unis !")
} else {
    print("Vous êtes mineur.")
}

La console vous retourne "Vous êtes majeur, mais pas aux Etats-Unis. 17 ". Pourtant, l'âge est bien de 32. C'est tout à fait normal ! Le programme a lu la première condition : 32 est bien plus grand que 18. J'exécute ce qu'il y a entre les accolades et j'oublie toutes les autres conditions qui suivent. Ceci pour vous dire d'avoir un peu de bon sens et de faire attention à l'ordre de vos conditions !

Les conditions multiples

Jusqu'alors, nous avons réalisé nos conditions sur une seule valeur. Sachez qu'il est possible de combiner plusieurs conditions pour n'en former au final qu'une seule. 

Les booléens

Avant cela, j'aimerais vous parler des booléens. Rappelez-vous, un booléen est soit vrai, soit faux. Une condition est tout simplement un booléen ! Si on a 32 ans, 32 ans est supérieur à 18 ans : c'est vrai. 12 ans est supérieur à 18 ans : c'est faux.

De ce fait, quand votre programme va s'exécuter, si on a affecté 32 à la variableage alors :age >= 18 sera implicitement remplacé par true. Du coup, quand on lit des conditions, de façon beaucoup plus simple on lira : si c'est vrai fais-moi ça, sinon si ça c'est vrai fais-moi ça, sinon tant pis tout est faux donc fais-moi ça.

Une façon simple de voir si ce que je dis est vrai, est d'utiliser ce code.

if true {
    print("Ce message s'affichera dans la console")
}

if false {
    print("Ne s'exécutera jamais.")
    // D'ailleurs Xcode vous le précise "Will never be executed"
}

La condition vraie est bien exécutée, la fausse ne l'est pas.

Il y a donc possibilité d'écrire des conditions sur des variables booléennes plus rapidement.

let booleen: Bool = true

// Cette partie est identique à...
if booleen == true {
    print("La variable booleen vaut vrai !")
} else {
    print("La variable booleen vaut faux !")
}

// ... cette partie
if booleen {
    print("La variable booleen vaut vrai !")
} else {
    print("La variable booleen vaut faux !")
}

Toutefois, avec cette méthode, vous ne pouvez pas tester rapidement si la variable est fausse. C'est là que je vous présente!

Le point d'exclamation représente le "not", soit non en français. Placer un point d'exclamation devant un booleen revient à exprimer son inverse : si c'est vrai alors ça devient faux, si c'est faux alors ça devient vrai.

let vrai: Bool = true
let faux: Bool = false

if vrai {
    print("Vrai vaut vrai")
}

if !faux {
    print("Un non faux est équivalent à vrai")
}

Combiner des conditions dans une condition

Maintenant que je vous ai expliqué le principe des booléens, il vous sera plus facile de comprendre la suite. Essayons donc de poser plusieurs conditions à la fois. Voici un nouveau tableau de signes à connaître pour cela.

Signe

Signification

Vrai quand ?

&&

et

Vrai quand les deux valeurs sont vraies.

||

ou

Vrai quand au moins une des deux valeurs est vraie.

Utilisez maintenant ces signes pour combiner vos conditions. Essayez de réaliser cette condition : si l'âge est supérieur ou égal à 21 ET la nationalité est "USA" alors fais ceci.

Voici comment vous devriez l'écrire :

let age: Int = 32
let nationalite: String = "USA"

if age >= 21 && nationalite == "USA" {
    print("Vous êtes Américain et en plus vous êtes majeur.")
}

C'est tout simple et ça se lit facilement ! Changez une des deux valeurs de façon à ce qu'une condition soit fausse, et vous verrez que le message ne s'affichera plus. Ceci est valable car nous avons utilisé un ET. Si vous aviez utilisé un OU, alors il suffit juste qu'une des deux conditions soit vraie (ou les deux) pour que toute la condition le soit.

En bref, ces deux opérateurs&&  et|| vont unifier deux conditions en une seule.

Vous pouvez utiliser autant de fois ces opérateurs que vous le voulez. 

Néanmoins, pour ne pas vous emmêler les pinceaux, vous pouvez définir un ordre de priorité pour réaliser les conditions en plaçant des parenthèses. Je m'explique sur un exemple.

let age: Int = 20
let nationalite: String = "FR"

if (age >= 21 && nationalite == "USA") || (age >= 18 && nationalite == "FR") {
    print("Vous êtes majeur.")
}

Voici comment lire cette condition : Si l'âge est supérieur ou égal à 21 et que sa nationalité est "USA" OU l'âge est supérieur ou égal à 18 et que sa nationalité est "FR" alors fais ça. 

Si vous ne placez pas de parenthèses, alors les conditions vont se vérifier selon un ordre de priorité que voici (de la priorité la plus haute à la priorité la plus basse).

Signification

Opérateur

Parenthèses

(, )

Non

!

Multiplication, division, modulo

*, /, %

Addition soustraction

+, -

Inférieur, inférieur ou égal, supérieur, supérieur ou égal

<, <=, >, >=

Égal, différent de

==, !=

Et

&&

Ou

||

C'est comme pour les maths : vous effectuez d'abord les multiplications ou divisions avant les soustractions et additions. Là, c'est pareil. Vous faites d'abord ce qu'il y a entre parenthèses, puis le non, puis la multiplication ou division, etc.

Switch : quand il y a beaucoup de conditions

Voilà une nouvelle instruction qui permettra de faire exactement la même chose qu'un if... else if... else . 

Euh.. c'est quoi l'intérêt du coup ? o_O

Regardez ce code :

let note = 18

if note == 10 {
    print("Vous avez la moyenne, mais vous n'obtenez pas de mentions.")
} else if note == 12 {
    print("Vous avez obtenu la mention assez bien.")
} else if note == 14 {
    print("Vous avez obtenu la mention bien.")
} else if note == 16 {
    print("Vous avez obtenu la mention très bien.")
} else if note == 18 {
    print("Vous avez les félicitations du jury !")
} else {
    print("Navré, il faut avoir une de ces notes pour avoir une mention.")
}

Ça semble assez rébarbatif, vous ne trouvez pas ? Et encore, imaginez, si vous voulez attribuer une mention spéciale pour chaque note de 0 à 20 ? Ça vous fait beaucoup deelse if à écrire. Peut-être que ça ne vous dérange pas d'écrire comme ça, mais un bon programmeur est un programmeur fainéant, on veut toujours plus rapide. 15 

À l'aide d'un switch, nous pouvons aller plus vite pour écrire l'exemple de code ci-dessus.

let note = 18

switch note {
case 10:
    print("Vous avez la moyenne, mais vous n'obtenez pas de mentions.")
    
case 12:
    print("Vous avez obtenu la mention assez bien.")
    
case 14:
    print("Vous avez obtenu la mention bien.")
    
case 16:
    print("Vous avez obtenu la mention très bien.")
    
case 18:
    print("Vous avez les félicitations du jury !")
    
default:
    print("Navré, il faut avoir une de ces notes pour avoir une mention.")
}

Le résultat reste ici exactement le même mais le code devient plus simple à écrire et peut être plus simple à comprendre. En effet, vous trouvez maintenant beaucoup moins d'accolades, de double signe égal ou encore le mot-clé else if . Ici, les accolades marquent le début et la fin du switch.

  • On précise dans un premier temps sur quelle valeur on veut tester l'égalité en précisant la variable après leswitch.

  • Ensuite, il y a le mot clé case (qui signifie "cas" en français). Si on prend le cas 10, alors on va tester sinote == 10.

  • Le deux-points :  précisera la fin ducase.

  • À la suite de ça, écrivez les instructions que vous souhaitez réaliser pour ce cas.

Il est aussi possible de réaliser la même action pour plusieurs valeurs différentes. Pour cela, séparez les valeurs par des virgules : par exemplecase 1, 2, 3: .  On pourrait donc se rapprocher encore mieux de ce que l'on souhaite.

let note = 19

switch note {
case 0,1,2,3,4,5,6,7,8,9:
    print("Vous n'avez pas la moyenne, vous n'avez donc pas de mention.")
    
case 10, 11:
    print("Vous avez la moyenne, mais vous n'obtenez pas de mentions.")
    
case 12, 13:
    print("Vous avez obtenu la mention assez bien.")
    
case 14, 15:
    print("Vous avez obtenu la mention bien.")
    
case 16, 17:
    print("Vous avez obtenu la mention très bien.")
    
case 18, 19, 20:
    print("Vous avez les félicitations du jury !")
    
default:
    print("Navré, il faut avoir une de ces notes pour avoir une mention.")
}

 

 

Enfin, nous pouvons encore être plus précis grâce à ce qu'on appelle les range. On indique une valeur, 3 petits points et une deuxième valeur et le range comprendra toutes les valeurs comprises entre ces deux valeurs.

let note = 19

switch note {
case 0...9:
    print("Vous n'avez pas la moyenne, vous n'avez donc pas de mention.")
    
case 10...12:
    print("Vous avez la moyenne, mais vous n'obtenez pas de mentions.")
    
case 12...14:
    print("Vous avez obtenu la mention assez bien.")
    
case 14...15:
    print("Vous avez obtenu la mention bien.")
    
case 16...18:
    print("Vous avez obtenu la mention très bien.")
    
case 18...20:
    print("Vous avez les félicitations du jury !")
    
default:
    print("Navré, il faut avoir une de ces notes pour avoir une mention.")
}

Seulement, les valeurs ici sont incluses. Ainsi, si on a 12, on n'aura pas la mention assez bien mais pas de mention tout court car on rentrera dans lecase 10...12: . Il faut pour cela exclure la dernière valeur. Pour ça, il faut retirer un point juste avant votre deuxième valeur et le remplacer par "<". Nous avons donc un exemple final de ce type :

let note = 12

switch note {
case 0..<10:
    print("Vous n'avez pas la moyenne, vous n'avez donc pas de mention.")
    
case 10..<12:
    print("Vous avez la moyenne, mais vous n'obtenez pas de mentions.")
    
case 12..<14:
    print("Vous avez obtenu la mention assez bien.")
    
case 14..<16:
    print("Vous avez obtenu la mention bien.")
    
case 16..<18:
    print("Vous avez obtenu la mention très bien.")
    
case 18...20: // Ici on inclut évidemment le 20 !
    print("Vous avez les félicitations du jury !")
    
default:
    print("Navré, il faut avoir une de ces notes pour avoir une mention.")
}

Utilisez switch quand vous le voulez. Il est préférable de l'utiliser quand vous avez de nombreuses conditions à faire et qui en plus testent l'égalité d'une variable.

Les conditions ternaires

Il existe une toute dernière condition : la condition ternaire. Celle-ci n'est pas souvent utilisée mais elle permet de tester une variable et de mettre le résultat dans une nouvelle variable. C'est grosso-modo unif... else .

let note = 12
var moyenne: Bool

// Cette partie
if note < 10 {
    moyenne = false
} else {
    moyenne = true
}

// Est identique à cette partie
moyenne = note < 10 ? false : true
  • On écrit d'abord la variable dans laquelle on veut affecter la valeur.

  • Ensuite, on réalise notre condition qu'on termine par un point d'interrogation.

  • Ensuite, on écrit la valeur que doit prendre la variable si la condition est vérifiée et on y ajoute un deux points:.

  • Enfin, on écrit la valeur que doit prendre la variable si la condition n'est pas vérifiée.

Voilà. C'est un peu difficile à lire, surtout quand on ne connaît pas, et c'est un peu pour ça que les conditions ternaires ne sont pas souvent utilisées. Je vous présente cette condition ici pour que vous n'ayez pas peur si un jour vous la rencontrez dans le code source de quelqu'un d'autre. :)

Pour résumer :

  • Les conditions permettent d'effectuer des actions en fonctions de la valeur de vos variables.

  • La forme la plus courant estif... else if... else  mais il existe aussi leswitch .

  • Leswitch ne permet de tester que l'égalité.

  • Vous pouvez combiner des conditions pour n'en former qu'une seule à l'aide des opérateurs&&  et|| .

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