Dans ce chapitre, nous allons finaliser l'application ! Pour rappel, nous suivons les étapes suivantes :
Nous allons apprendre à modifier le texte du label. ✅
Nous allons créer nos tableaux. ✅
Nous allons sélectionner un élément aléatoire dans chaque tableau. ✅
Nous allons les combiner pour créer notre phrase.
Les trois premières sont faites, plus que la dernière !
Euh tout doux, mon écran voit jaune !
C'est-à-dire ?
Regarde, j'ai plein de triangles jaunes !
![En chaque de toutes les lignes de code, des messages d'erreur surlignés en jaune s'affichent](https://user.oc-static.com/upload/2022/05/09/16520804894654_image93.png)
Les erreurs dans Xcode
Xcode est un logiciel intelligent. Il relit votre code en permanence et vous indique s’il est correct ou non, et même s'il pourrait être amélioré. C'est tellement utile qu'il faut que vous compreniez dès maintenant comment cela fonctionne !
Les types d'erreurs
Xcode génère des erreurs de 2 niveaux différents :
Les erreurs
Les erreurs sont des problèmes qui empêchent l'exécution de votre code. Si vous essayez de lancer votre application alors que votre projet contient des erreurs, ça ne marchera pas. Vous recevrez le message : "Build Failed".
Les avertissements
Les avertissements sont des erreurs mineures qui n'empêchent pas votre code de s'exécuter. Parfois, il peut s'agir de suggestions de Xcode pour améliorer la qualité de votre code. Parfois, Xcode vous avertit que votre code est dangereux, c'est-à-dire qu'il est facilement susceptible de crasher.
Voir les erreurs
Pour voir toutes les erreurs de votre projet, nous allons découvrir un nouvel onglet du navigateur (panneau de gauche) : celui des erreurs !
![Le navigateur des erreurs dans le panneau de gauche. On y voit une liste de message d'erreur avec de petits panneaux Attention jaunes](https://user.oc-static.com/upload/2022/05/09/1652080629399_image32.png)
Ici sont rassemblées toutes les erreurs du projet dans tous les fichiers. En cliquant sur une erreur, Xcode vous renvoie au fichier correspondant. Cela peut être pratique quand une modification dans un fichier entraîne une erreur dans un autre.
Si vous voulez seulement savoir combien d'erreurs contient votre projet, pour vérifier par exemple qu'il n'y en a pas, vous pouvez jeter un coup d'œil en haut de l'interface de Xcode :
![Running Teki on iPhone 11. 5 avertissements symbolisés par des triangles sont indiqués à droite](https://user.oc-static.com/upload/2022/05/09/16520807271938_image94.png)
À droite, Xcode indique le nombre d'erreurs dans tout le projet.
Résoudre les erreurs
Pour les résoudre, il y a deux options :
L'icône d'erreur contient un point d'exclamation. Lisez la description et, si vous ne trouvez pas la solution seul, je vous suggère de copier la description dans Google. Quelqu'un a probablement rencontré cette erreur et une solution a été trouvée.
L'icône d'erreur contient un point. C'est notre cas ici. Dans ce cas, Xcode est capable de résoudre lui-même l'erreur.
Dans ce deuxième cas, il vous suffit de cliquer sur l'icône (ici le triangle jaune) pour voir la solution que propose Xcode :
![À côté du triangle jaune la solution est décrite. Le bouton fix apparaît](https://user.oc-static.com/upload/2022/05/09/16520808814027_image60.png)
Il suffit ensuite de cliquer sur Fix
pour que Xcode applique le changement.
Nous allons voir maintenant ce que veut dire ce let
que nous propose Xcode.
Les constantes
Nous avons une erreur parce que je ne vous ai pas tout dit sur les variables !
En fait, il y en a de deux types différents : les variables et les constantes. Sauriez-vous deviner la différence entre les deux ?
Les variables varient et les constantes… et bien elles restent constantes ! Facile, non ?
Déclarer une constante
Pour déclarer une variable, on utilise le mot clé var
comme variable… Et pour déclarer une constante, on utilise le mot clé let
.
Par exemple :
var variable = 0 // Je peux être modifié
let constant = 0 // Je ne peux pas être modifié
Si ensuite, je veux essayer de modifier ces variables :
variable = 1
constant = 1 // Cannot assign to value: 'constant' is a 'let' constant
Xcode ne dira rien pour la première ligne, mais il affichera une erreur rouge pour la deuxième en vous expliquant qu'il ne peut pas modifier la variable, car c'est une constante.
Intérêt des constantes
Soit. Mais quel est l'intérêt de créer une variable qui ne peut pas être modifiée ?
Souvent, on va avoir besoin d'une variable pour juste stocker une donnée, mais pas forcément pour la modifier. Or stocker une donnée consomme de la mémoire. Et stocker une donnée que l'on peut modifier en consomme bien plus !
Pourquoi ?
Cela nécessite une petite explication.
Les constantes et la mémoire
La mémoire d'un ordinateur fonctionne comme une commode. Imaginez une commode infiniment longue avec des tonnes de tiroirs les uns à la suite des autres.
Prenons la variable suivante comme exemple :
var message = "bonjour"
Pour stocker cette variable, votre ordinateur va stocker chaque lettre dans un tiroir comme ceci :
![Les lettres B O N J O U R sont écrites à la ligne, chacune dans une case. Une légende indique que ces 7 cases constituent le message variable](https://user.oc-static.com/upload/2022/05/09/16521081409721_p4c3-1.png)
La variable message coûte 7 tiroirs de mémoire.
En fait, pas exactement… Parce que la variable message
est une variable ! Donc elle peut varier ! Que se passe-t-il alors si au lieu de "bonjour", la variable devient "bonjour, comment ça va ?" ? Il va falloir occuper plein de nouveaux tiroirs ! Mais que fait-on si les tiroirs suivants ont déjà été remplis entre temps avec d'autres variables ? Là, il y a conflit !
Pour prévenir cette catastrophe, l'ordinateur va prendre de la marge. Donc en fait voici à quoi ressemble la variable message
dans la mémoire :
![Les lettres B O N J O U R sont écrites à la ligne, chacune dans une case. Une légende indique que le message variable peut dépasser dans des cases qui viennent après ces 7 lettres](https://user.oc-static.com/upload/2022/05/09/16521082891489_p4c3-2.png)
À la création de la variable, comme l'ordinateur sait que cette variable est susceptible d'être modifiée, il réserve beaucoup de tiroirs supplémentaires ! Évidemment, c'est autant de tiroirs perdus pour stocker d'autres variables qui permettront d'autres opérations.
D'où les constantes ! Si l'on déclare message
comme étant une constante comme ceci :
let message = "bonjour"
Dans ce cas, elle sera bien stockée sur seulement 7 tiroirs :
![Les lettres B O N J O U R sont écrites à la ligne, chacune dans une case. Une légende indique que ces 7 cases constituent la constante](https://user.oc-static.com/upload/2022/05/09/16521083464739_p4c4-2.png)
C'est donc beaucoup plus optimisé d'utiliser des constantes. Voilà leur principale raison d'être ! Je vous recommande alors d'utiliser dès que possible des constantes.
C'est d'ailleurs ce que vous suggère Xcode :
Variable 'randomIndex1' was never mutated; consider changing to 'let' constant
Il constate que la variable n'est jamais modifiée et nous suggère donc de la déclarer en tant que constante plutôt que variable. Vous pouvez donc transformer les 4 variables concernées en constantes pour supprimer les avertissements.
Votre ViewController.swift
devrait ressembler à ça :
import UIKit
class ViewController: UIViewController {
let celebrities = ["le Steve Jobs", "le Zinedine Zidane", "la Madonna", "le Karl Lagerfeld", "la Scarlett Johansson"]
let activities = ["du dancefloor", "du barbecue", "de la surprise ratée", "des blagues lourdes", "de la raclette party"]
@IBOutlet weak var quoteLabel: UILabel!
@IBAction func changeQuote() {
// On séléctionne un élément alétoire parmi les célébrités
let randomIndex1 = Int.random(in: 0..<celebrities.count)
let celebrity = celebrities[randomIndex1]
print(celebrity)
// On séléctionne un élément aléatoire parmi les activités
let randomIndex2 = Int.random(in: 0..<activities.count)
let activity = activities[randomIndex2]
print(activity)
// On modifie le texte
quoteLabel.text = "Le texte du label est modifié !"
}
}
C'est du beau travail ! On touche au but, plus qu'une étape !
Créer notre citation
Il ne nous reste plus qu'à combiner les trois parties de notre phrase. Pour cela, nous allons utiliser un outil bien pratique du type String : la concaténation.
La concaténation, c'est l'addition de chaînes de caractères les unes après les autres. Et pour faire une addition, rien de plus simple ! On utilise le signe plus + !
Par exemple :
var rapport = "Tout " + "va " + "bien !"
print(rapport) // Xcode affiche dans la console : Tout va bien !
Donc pour créer notre citation, nous n'avons plus qu'à assembler les trois parties de notre phrase :
let quote = "Tu es " + celebrity + " " + activity + " !"
Il ne nous reste plus qu'à rajouter ce texte dans le label :
quoteLabel.text = quote
Et voilà ! Votre fonction doit désormais ressembler à :
@IBAction func changeQuote() {
// On séléctionne un élément alétoire parmi les célébrités
let randomIndex1 = Int.random(in: 0..<celebrities.count)
let celebrity = celebrities[randomIndex1]
// On séléctionne un élément aléatoire parmi les activités
let randomIndex2 = Int.random(in: 0..<activities.count)
let activity = activities[randomIndex2]
// On construit la citation et on l'affecte au texte du label
let quote = "Tu es " + celebrity + " " + activity + " !"
quoteLabel.text = quote
}
Vous pouvez tester votre projet ! Lancez l’application et cliquez sur le bouton !
![Notre interface Teki en GIF : à chaque clic, une nouvelle combinaison de phrases est proposée !](https://user.oc-static.com/upload/2022/05/18/16528858400537_ezgif.com-gif-maker.gif)
À chaque clic, une nouvelle citation est générée !
En résumé
Xcode propose 2 niveaux d'erreurs :
les erreurs qui empêchent le code de s'exécuter ;
les avertissements qui n'empêchent pas le code de s'exécuter.
Vous devez toujours résoudre les erreurs et avertissements dès qu'ils surviennent.
Pour concaténer plusieurs chaînes de caractères entre elles, on utilise le signe plus : +.
Félicitations ! Vous avez créé votre première application iPhone ! 🎉🎊