Utiliser le chainage des optionnels en Swift

Bonjour,

Dans le nouveau cours de Maxime sur les optionnels dans le cours Swift il ne met pas de « == » dans le if est ce normal svp ?

Merci

Oui, c’est normal.

L’instruction conditionnelle if agit en fonction d’une valeur binaire.

Exemple :

if contacts == 3 {
  ...
}

Le code commence par tester si la variable contacts contient 3, génère une valeur booléenne (false true) en fonction du test, et la communique au if. Là, l’instruction == est nécessaire pour comparer des valeurs numériques.

On voit souvent dans les codes, ce genre de syntaxe :

if test == true {
}

Le test == true est inutile, il suffit d’écrire :

if test  {
}

Ou dans le cas d’un test sur la valeur négative :

if !test {
}

qui est l’équivalent de :

if test == false {
}

if let winner = nomGagnant {
  print (winner)
}

L’instruction if let fonctionne en deux phases :

  • Elle commence par essayer de créer une valeur non optionnelle (une variable normale donc), à partir d’une variable optionnelle. Une valeur booléenne est générée indiquant si l’opération a réussie ou pas.

  • Elle utilise l’instruction if pour tester l’indicateur booléen de réussite, et agit en conséquence. Le programmeur n’a pas accès à cette valeur binaire. C’est une information temporaire…


Pour faire court, l’opérateur == permet de comparer deux variables. (COMPARAISON DE DEUX VALEURS)

L’opérateur if let permet de transformer une valeur optionnelle en une valeur non optionnelle. (AFFECTATION D’UNE VALEUR)

Les deux instructions se ressemblent visuellement, mais le fonctionnement interne est complètement différent.

5 « J'aime »

C’est limpide … merci Draken !

Normal. le if porte sur la possibilité d’affecter nomGagnant à la constante winner, et donc rassemble deux étapes en une. Les deux étapes seraient :
nomGagnant != nil et let winner = nomGagnant. Ces deux étapes sont rassemblées dans la condition, et permettent de prévoir un bloc soumis à la condition en ayant déjà affecté à winner une valeur certaine, si toutefois la condition est réalisée. C’est un raccourci, bien documenté par Apple dans toutes les docs par ailleurs. Il y en a un certain nombre avec le Swift… Et ça surprend toujours un peu.

Merci bien pour ton analyse

J’ai une autre question dans ce chapitre :
dans le fond je ne comprends pas pourquoi on doit avoir recours à ce if let à la fin puisque la conditon est vraie, déjà réalisée et utilisée : on a nomGagnant, on l’a même modifié, pourquoi ne peut-on pas directement lui dire ensuite :

print(nomGagnant)    

?
Je sais bien que ça marche pas, j’ai testé, il veut pas, mais pourquoi ? (j’ai rien compris de la raison qu’il m’a donné ! :sweat_smile:). Sauf si je rajoute « as Any », qu’il m’a conseillé de rajouter :

print(nomGagnant as Any)   

mais dans ce cas, il print ceci dans la console : Optional(« Dupont :tada: »)
(Dupont étant le nom du gagnant)
:sweat_smile:

Non, la condition n’est pas forcément vraie. La fonction saisirTexte() retourne un optionnel, parce qu’elle considère qu’il peut y avoir un problème à un moment ou un autre, qu’une erreur est possible. Sinon, elle retournerais un String normal.

L’opérateur append pour modifier le nom est conditionnel. Le ? signifie « si la variable existe, alors l’opération peut être faite, sinon on ne fait rien ».

print() est une vieille fonction (plusieurs dizaines d’années) nécessitant obligatoirement un texte complet pour s’exécuter, sinon c’est le gros plantage. D’où le besoin de contrôler la validité de la variable avant de la convertir pour l’afficher.

1 « J'aime »

Ahhh, oui, tu as raison, on a déjà agit sur nomGagnant à ce stade, mais toujours de façon conditionnelle.

Merci !