Joe débarque chez vous très excité !
Salut !
J'ai vu tout ce que tu fais, c'est super ! Cela m'a même donné une idée !
Alors, voilà ce que je te propose. Ton outil permet de prévoir mes recettes. Mais parfois il y a des imprévus, et je ne fais pas exactement les choses selon ton modèle. Mais ça me serait très utile pour gérer ma ferme. Est-ce que tu penses que tu pourrais me faire un logiciel de gestion de ma ferme ?
C'est-à-dire ?
Eh bien c'est simple. Chaque jour, je rentre mes activités de la journée, et le programme calcule tout à ma place. Mes dépenses, mes recettes, le stockage de mes produits, etc.
Tu penses que c'est possible ?
Bien sûr !
Vous avez fait un nouvel adepte de la technologie, apparemment !
Utilisez le terminal
Pour pouvoir créer le logiciel de Joe, nous allons devoir cesser d'utiliser le Playground. Eh oui, ça vous attriste. Moi aussi ! Car le Playground ne permet pas d'interaction avec un utilisateur. Et Joe veut pouvoir interagir avec le programme pour décrire ses journées.
Mais c'est pour découvrir de nouvelles choses encore plus passionnantes ! Comme le terminal, par exemple.
Le terminal, c'est un logiciel qui existe dans tous les ordinateurs. En fait, avant que les ordinateurs aient une interface graphique avec une souris qui permet d'interagir avec son ordinateur, on faisait tout au clavier avec un terminal.
Le terminal, ça ressemble à ça :
C'est pas joli joli vu comme ça, mais ne vous inquiétez pas, ça va bien se passer !
L'éditeur en ligne de commande
Pour aller dans le terminal, il vous suffit d'ouvrir l'application Terminal qui se trouve dans votre dossier /Applications
. Ouvrez-la et tapez swift
puis entrée. Vous devriez obtenir quelque chose comme ça :
C'est l'éditeur Swift en ligne de commande. Il vous permet de taper du code et d'en obtenir un résultat. Vous pouvez écrire ce que vous voulez. Cela fonctionne comme le Playground, sauf que Swift vous répond après chaque ligne. Par exemple, vous pouvez écrire :
Je vous laisse jouer un peu avec l'éditeur en ligne de commande. Vous pouvez utiliser tout ce que vous avez appris jusque-là pour faire des mini-programmes.
Seulement, cet éditeur comporte plusieurs défauts :
Il n'y a pas la colorisation ni l'autocomplétion que propose Xcode.
On ne peut pas revenir à la ligne précédente pour changer quelque chose.
On ne peut pas sauvegarder son travail.
On va donc changer notre stratégie et écrire notre code dans un fichier Swift. Laissez-moi vous montrer.
Exécutez un fichier Swift
Dans Xcode, allez dans l'onglet File / New... / File. Ou utilisez le raccourci cmd + n . Xcode affiche l'interface suivante :
Choisissez Swift File. Et cliquez sur Next. Ensuite vous choisissez le nom de votre fichier. Je vous propose de l'appeler Hello
, et de le sauvegarder sur votre bureau. Le fichier est ensuite créé et contient ceci :
//
// Hello.swift
//
//
// Created by Danyl SEMMACHE on 29/11/2021. .
//
//
import Foundation
Vous pouvez tout supprimer. Je vous propose d'écrire simplement la ligne suivante :
print("Hello World !")
Notre fichier est maintenant prêt à l'essai, et nous allons l'exécuter. Pour cela, écrivez d'abord cette commande :
cd ~/Desktop
Maintenant, nous allons pouvoir exécuter notre code avec la commande :
swift Hello.swift
Cette commande se lit "Utilise Swift pour lire et exécuter le fichier suivant".
Le programme s'exécute, et donc vous devriez voir :
Hello World!
Utilisez la commande readLine()
Maintenant que nous savons exécuter un fichier, nous allons pouvoir gérer l'interaction avec un utilisateur. Pour cela, nous allons utiliser une nouvelle méthode : la méthode readLine
.
Lorsque le programme rencontre cette méthode, il s'interrompt et attend que l'utilisateur écrive quelque chose. Par exemple, rajoutons cela à notre programme :
print("Comment vous appelez-vous ?")
var name = readLine()
print("Bonjour \(name)")
Sauvegardez et exécutez ! Tout d'abord la console affiche :
Comment vous appelez-vous ?
Puis l'exécution s'interrompt, c'est à l'utilisateur d'écrire. Écrivez par exemple Joe
, et appuyez sur Entrée. Le programme reprend et affiche :
Bonjour Optional("Joe")
Eh oui ! La fonction readLine
a pour type de retour String?
. La fonction renvoie donc un optionnel.
À noter qu’il y a deux cas de figure clairement distincts sur ce que readLine
renvoie si l'utilisateur décide de ne pas répondre, en fonction du type d’application que vous avez choisi lors de la création de votre projet sur Xcode :
Application
Command Line Tool
: la variablename
contiendrait uneString
, autrement dit une chaîne de caractères, vide via le terminal de commande.Application
App
: la variablename
contiendrait unnil
dans les applications mobiles iOS classiques que vous connaissez tous ! ;)
Pour parer cela, nous allons modifier un peu notre programme pour déballer notre variable de manière sécurisée :
print("Comment vous appelez vous ?")
if let name = readLine() {
print("Bonjour \(name)")
}
Maintenant le programme affichera bien :
Bonjour Joe
Découvrez la notion d’algorithme
Avant d’écrire notre programme, je pense qu’il est temps que je vous parle un peu de ce que sont les algorithmes.
Kézako ? Un algorithme ?!
Pas de panique ! Et si je vous disais qu’un algorithme, c’est ce que nous sommes en train d’écrire depuis le début de ce cours, et que c’est une chose que vous faites depuis toujours sans même le savoir !
Un algorithme, c’est une suite d'instructions qui vont nous permettre d’obtenir un résultat à partir de différents éléments que l’on va lui fournir.
L’exemple parfait qui me vient en tête en écrivant ces lignes est celui d’une recette de cuisine : en suivant les étapes de la recette, cela nous permet d’obtenir un plat à partir d’ingrédients grâce à une réaction chimique. Les différentes étapes de la recette représentent donc les opérations qui constituent l’algorithme :
// Recette d’un gâteau au chocolat
let chocolat = 200 //200g
let farine = 50 //50g
let sucre = 100 //100g
let beurre = 100 //100g
let oeuf = 3 //3 oeufs
let cuisson = 180 //180°C
let gâteauAuChocolat = [chocolat, farine, sucre, beurre, oeuf, cuisson]
for étapes in gâteauAuChocolat {
if étapes == cuisson {
print (“Le gâteau est prêt”)
} else {
print (“Étape suivante”)
}
}
La console affichera donc :
Étape suivante Étape suivante Étape suivante Étape suivante Étape suivante Le gâteau est prêt !
Vous voyez, pour le code : c’est exactement pareil ! ;)
De manière générale, si on regarde autour de nous, notre monde est régi par des algorithmes. Les algorithmes permettent aux gens de se localiser, de trouver l’amour, de prendre des décisions, de trouver des informations sur le Web, et il y a des millions d’autres applications. Ils sont omniprésents dans notre société.
Gardez donc en tête qu’un algorithme a pour but de résoudre un problème pour une situation donnée, en produisant un résultat via une liste d'instructions. Un algorithme est l’outil qui va nous permettre de répondre à un besoin, quel qu’il soit !
Rédigez le programme
Le programme que nous allons rédiger s'inspire de ce que nous avons déjà fait. Il va poser des questions à l'utilisateur et écouter ses réponses en suivant ce schéma :
À chaque fois que l'on atteint un stop dans le schéma précédent, on recommence au début. Prenez le temps de bien comprendre ce schéma pour suivre correctement la suite.
Pour sélectionner un choix, l'utilisateur devra entrer le numéro correspondant. Voilà à quoi va ressembler le programme dans la console :
Que voulez vous faire ? 1. 🤸♂️ Enregistrer une nouvelle activité 2. 🏦 Consulter ma banque 3. 🏠 Consulter ma grange 2 Vous avez 1254€ à la banque ! Que voulez vous faire ? 1. 🤸♂️ Enregistrer une nouvelle activité 2. 🏦 Consulter ma banque 3. 🏠 Consulter ma grange etc.
Alors, allons-y ! Créons un nouveau fichier Swift que l'on va appeler FarmSoft
.
Le début du logiciel est simple. Il suffit d'afficher la première question :
print("""""
Que voulez vous faire ?
1. 🤸 Enregistrer une nouvelle activité
2. 🏦 Consulter ma banque
3. 🏠 Consulter ma grange
"")
Ensuite, il suffit d'ajouter l'écoute de la réponse avec readLine
.
if let choice = readLine() {
// Faire une action en fonction du choix de l'utilisateur
}
La variable choice
contient le choix de l'utilisateur, à savoir 1, 2 ou 3, à priori. On va donc pouvoir utiliser cette variable pour choisir notre action :
if let choice = readLine() {
if choice == "1" {
print("Vous voulez enregistrer une nouvelle activité !")
} else if choice == "2" {
print("Votre banque contient X euros !")
} else if choice == "3" {
print("""
Votre grange contient :
🍼 X bidons de lait
🌾 X bottes de blé
⚪️ X pelottes de laine
""")} else {
print("Je ne comprends pas.")
}
}
En fonction du choix de l'utilisateur, le programme affiche des réponses différentes. Testez votre programme pour vérifier que tout fonctionne bien !
C'est un bon début. Mais la syntaxe suivante n'est pas très belle :
if choice == "1" {
} else if choice == "2" {
} else if choice == "3" {
} else {
}
Pour améliorer ça, nous allons découvrir l’une des dernières structures de contrôle de Swift (comme ça, vous les connaîtrez presque toutes !).
Utilisez le switch
Pour rappel, voici les trois structures de contrôle que vous connaissez :
La boucle while.
La boucle for.
L'instruction if / else if / else.
Le switch est une 7e structure de contrôle. Le switch, comme l'instruction if / else, permet de gérer des conditions. Le switch est en particulier utile pour gérer des conditions répétitives comme nous avons ici.
Sa syntaxe est un peu spéciale, mais très pratique :
switch variable {
case valeur1:
// Instructions 1
case valeur2:
// Instructions 2
case valeur3:
// Instructions 3
default:
// Instructions par défaut
}
La variable
est évaluée. Si elle est égale à valeur1
, les instructions 1 sont effectuées ; si elle est égale à valeur2
, les instructions 2 sont exécutées, etc. Si la variable n'est égale à aucune des valeurs, les instructions dans default
sont exécutées.
Le code précédent est équivalent à :
if variable == valeur1 {
// Instructions 1
} else if variable == valeur2 {
// Instructions 2
} else if variable == valeur3 {
// Instructions 3
} else {
// Instructions
}
Vous avouerez que c'est quand même plus élégant avec le switch
!
À vous de jouer
Le contenu de l’exercice se trouve dans le dossier Github P4C2.1.
Ouvrez un nouveau Playground Xcode.
Copiez le contenu du fichier “main.swift” dans votre Playground.
Suivez les instructions.
Félicitations ! Vous savez désormais utiliser presque toutes les structures de contrôle en Swift ! Les voici :
Boucles | for in | while / repeat-while |
Instructions conditionnelles | if / else if / else | switch |
Et maintenant c'est à vous de jouer ! Je vous laisse implémenter tout le programme seul. Tout est dans ce schéma que je vous redonne :
Oui, c'est un assez gros exercice ! Mais il n'utilise rien de plus que ce que vous savez déjà. Et une bonne partie du code a déjà été rédigé dans le Playground, donc vous en êtes parfaitement capable. C'est un bon moyen de vérifier vos acquis avant de passer à la suite ! Retroussez vos manches et finissez-moi ça vite fait bien fait ! Joe compte sur vous !
Vous pouvez réaliser le programme grâce à cet exercice qui se trouve dans le dossier Github P4C2.2.
Ouvrez un nouveau Playground Xcode.
Copiez le contenu du fichier “main.swift” dans votre Playground.
Suivez les instructions.
Votre programme ne ressemble pas exactement à ceci ? Ce n'est pas grave ! L'essentiel, c'est qu'il fonctionne ! Voici quelques remarques concernant la solution que je propose :
Les variables
money
etbarn
sont définies tout en haut, car elles sont utilisées dans tout le programme. On dit que ce sont des variables globales, c'est-à-dire dont la portée est sur l'ensemble du fichier.J'ai organisé mon code avec des commentaires un peu spéciaux :
//======================
// MARK: - Activities
//======================
Les lignes 1 et 3 sont juste là pour attirer l'œil et permettre une distinction claire entre les parties. C'est assez courant, mais vous pouvez mettre ce que vous voulez, tant que c'est voyant. La ligne 2 contient l'instruction
MARK:
. Cette instruction permet à Swift de structurer le code dans l'inspecteur en haut :
Comme vous pouvez le voir, les fonctions sont séparées par les titres Parameters, Activities et Conversation, qui structurent le code. C'est pratique quand les fichiers deviennent assez longs.J'ai utilisé exclusivement des fonctions. Tout le code est encapsulé dans des fonctions, ce qui fait que le programme en lui-même se résume à :
// La boucle du programme
while true {
presentMenu()
}
Le
while true
permet de créer une boucle infinie. En effet, la conditiontrue
est par définition toujours vraie, donc la boucle while ne s'arrête jamais.
Découvrez le mot-clé where
C’est quoi “where” ?
Eh oui ! ‘Where’ (“où” en français) est un mot-clé dans Swift qui permet de filtrer facilement les valeurs. C'est simple et puissant ! Il peut être utilisé dans de nombreuses variantes différentes, et ici on va s'intéresser à deux d'entre elles. Allez, je vous montre ! ;)
For where
Vous vous rappelez de la boucle for-in ?
Comme vous le savez maintenant, la boucle for-in parcourt tous les éléments d'un tableau, vous permettant de les manipuler selon vos besoins.
Cependant, parfois, vous n'avez pas besoin de tous les éléments et à la place, vous voulez seulement un sous-ensemble. Dans ces circonstances, le mot-clé `where` est utile.
Par exemple, voici un tableau qui contient des acteurs (sauf un, je vous laisse deviner lequel ! ;)) :
let names = ["Tom Jedusor", "Taylor Swift", "Tom Cruise", "Chris Hemsworth", "Tom Hiddleston"]
Une boucle for-in classique pourrait afficher tous ces noms, mais en ajoutant une clause where
, nous pouvons restreindre la boucle, afin qu'elle ne fonctionne, uniquement sur les acteurs nommés “Tom” :
for name in names where name.hasPrefix("Tom") {
print(name)
}
Cela nous permet donc de filtrer et d’affiner davantage le résultat ! ;)
Switch where
Vous pouvez également utiliser where
avec switch
pour vérifier des conditions supplémentaires. Pour rappel, on utilise l'instruction switch
pour énumérer des cas, et elle est aussi utile pour gérer des conditions répétitives.
Disons que Joe souhaite avoir la température qu’il fait afin de pouvoir anticiper ses récoltes en fonction des températures paires et impaires :
var temperature = 100
switch (temperature) {
case 0...49 where temperature % 2 == 0:
print("Température froide et paire")
case 50...79 where temperature % 2 == 0:
print("Température modérée et paire")
case 80...110 where temperature % 2 == 0:
print("Température chaude et paire")
default:
print("Température hors plage ou impaire")
}
L'exemple ci-dessus vérifie non seulement le degré de température, mais aussi si le nombre est pair ou impair : avec les where
on peut donc ajouter des critères aux conditions, afin d’avoir un résultat plus précis.
En résumé
Le terminal est un logiciel qui permet d'utiliser son ordinateur entièrement avec le clavier. En connaissant les commandes, on peut faire tout ce qu'on fait à la souris, mais au clavier.
Pour lancer l'éditeur Swift en ligne de commande, il suffit d'écrire
swift
dans le terminal.Pour exécuter un fichier Swift, il faut écrire
swift
suivi du nom du fichier.La commande
readLine
permet d'interagir avec l'utilisateur en écoutant ce qu'il va écrire. Elle renvoie unString?
qu'il faut du coup déballer.La commande
switch
est une structure de contrôle que l'on utilise comme ceci :
switch variable {
case valeur1:
// Instructions 1
case valeur2:
// Instructions 2
case valeur3:
// Instructions 3
default:
// Instructions
}
Where
filtre facilement les valeurs :for where
permet de filtrer une liste.switch where
permet de vérifier des conditions supplémentaires.
Je suis sûr que les programmes pour terminal n’ont plus de secret pour vous. Comme vous avez super bien travaillé jusqu’ici, je vous propose d’aller plus loin avec les fonctions dans le prochain chapitre.