#Exercices Swift

#Modalités

  • Durée : ~2h à ~4h
  • En solo
  • Environnement : Swift Playgrounds ou Xcode
  • Rendu : Créez un Gist sur Github en format Markdown, le code doit être balisé correctement et noter l’URL du gist sur le document que je vous donnerai.
  • Dans toutes vos fonctions utilisez des paramètres nommés et des étiquettes de paramètres explicites.

📝 C’est un exercice noté et utile pour la suite, évitez d’utiliser ChatGPT, Github Copilot ou autre GAN pour le faire, ca serait dommage pour vous et votre carrière.

#Démarrage

  • Ouvrez XCode et créez un nouveau projet de type “Playground iOS” nommé “Exercices Swift”.

Alternativement vous pouvez utiliser Swift Playgrounds sur iPad ou Mac.

#Exercice 1 - Manipulation de liste

🛟

  1. Générez un nouveau tableau d’une taille de 20 entiers aléatoires de type Int.
  2. Créez une fonction qui prend en paramètre ce tableau d’entiers et qui retourne la somme de tous les éléments du tableau.
  3. Retournez la moyenne de tous les éléments du tableau.
  4. Retournez la valeur maximale du tableau.
  5. Filtrez les éléments pairs du tableau et retournez le tableau.
  6. Transformez le tableau en un tableau de String et retournez le tableau.

#Exercice 2 - Enum

🛟 Point sur les Enum

🧠 Les enums sont essentiels en Swift, tout comme dans les autres langages, modernes. On peut par exemple les utiliser pour facilement discriminer des réponses d’API Serveurs sans devoir faire des tests fastidieux et risqué sur le long terme sur des String ou des Int.

Le compilateur vous aidera à ne pas oublier un cas, à lever une erreur si jamais un enum change de nom, etc… C’est un outil très puissant, et très utile.


enum Animal {
    case cat
    case dog
    case elephant
    case giraffe
    case panda
    case penguin
    case cheetah
    case dolphin
    case lion
    case turtle
}
  1. Créer une fonction dans l’énum permettant d’afficher un émoji correspondant à l’animal.
  2. Créer une fonction qui retourne 🥩 pour les animaux carnivores, 🥕 pour les animaux herbivores et 🍔 pour les animaux omnivores.
  3. Créer une fonction qui retourne le nom de l’animal en Français.
  4. Créer une fonction qui retourne la phrase suivante en fonction de l’animal : “{animal (en 🇫🇷)}{:son emoji} est {type d’alimentation}{🥩/🥕/🍔}” vous n’utiliserez pas de switch ou de if pour cette question.

Utilisez CaseIterable pour récupérer la liste des valeurs de l’énum, et utiliser la dernière fonction pour afficher la phrase pour chaque animal.

Le resultat final doit être le suivant :

Chat 🐱 est 🥩.
Chien 🐶 est  🥩.
Elephant 🐘 est 🥕.
Giraffe 🦒 🥕.
Panda 🐼 est 🥕.
penguin 🐧 est 🍔.
Guepard 🐆 est 🥩.
Dauphin 🐬 est 🍔.
Lion 🦁 est 🥩.
Tortue 🐢 est 🥕.

#Exercice 3 - Optionnels

🛟 Point sur les Optionnels

struct Person {
    var name: String
    var age: Int?
    var city: String?
}

let people: [Person] = [
    Person(name: "Alice", age: 14, city: "Paris-sur-Mer"),
    Person(name: "Bob", age: nil, city: nil),
    Person(name: "Charlie", age: 30, city: "Baguette-ville"),
    Person(name: "David", age: nil, city: "Escargot-terre"),
    Person(name: "Eva", age: 22, city: nil),
    Person(name: "Frank", age: 40, city: "Tour-Eiffel-land"),
    Person(name: "Grace", age: 18, city: nil)
]
  1. Filtrer les personnes qui ont un age nil.
  2. Filtrer les personnes qui ont une ville nil.
  3. Filtrer les personnes qui ont un age nil et une ville nil.
  4. Afficher “Majeur” si la personne a plus de 18 ans, “Mineur” sinon, si l’age est nil, afficher “Age inconnu”.

#Exercice 4 - Delegation

🛟 Point sur les Classes

protocol ButtonListener {
    func clicked()
}

class Button {
    var listener: ButtonListener?

    func onClick() {
        listener?.clicked()        
    }
}

class MyInterface : ButtonListener{
    var someButton: Button
    
    init(button: Button) {
        someButton = button
    }
    
     func clicked() {
        print("A button has been clicked !")
    }
}

let myButton = Button()
let interface = MyInterface(myButton)

myButton.onClick()
  1. Ajouter la ligne de code permettant de faire fonctionner ce programme, vous devez obtenir l’affichage “A button has been clicked !” dans la console
  2. Modifier ce code pour utiliser une délégation de type closure plutôt que de type protocol.
  3. Modifier votre code pour accepter plusieurs boutons, chaque boutons doit envoyer un numéro de bouton et l’interface doit afficher quel bouton à été cliqué.

#Bonus - Generics

🛟 Point sur les Generics

Créez une classe générique Queue qui peut contenir des éléments de n’importe quel type. Ajoutez des méthodes pour enqueue (ajouter à la file) et dequeue (retirer de la file). La gestion doit être de type FIFO (First In First Out).

Aller + loin : On doit pouvoir s’abonner sur l’ajout ou la suppression d’un élément avec une closure ou un protocol.

#Pour aller plus loin dans la maitrise du langage

100 Days of Swift