#Exercices Swift

#Modalités

  • DurĂ©e : ~2h Ă  ~2h30
  • Environnement : Utiliser Swift Playgrounds ou Xcode pour coder les exercices
  • 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.

#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

swift

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 cet exercice.

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 :

swift
Chat đŸ± est đŸ„©.
Chien đŸ¶ est  đŸ„©.
Elephant 🐘 est đŸ„•.
Giraffe 🩒 đŸ„•.
Panda đŸŒ est đŸ„•.
penguin 🐧 est 🍔.
Guepard 🐆 est đŸ„©.
Dauphin 🐬 est 🍔.
Lion 🩁 est đŸ„©.
Tortue 🐱 est đŸ„•.

🧠 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.

#Exercice 3 - Optionnels

🛟 Point sur les Optionnels

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

let people: [Person] = [
    Person(name: "Alice", age: 25, city: "Paris-sur-Mer"),
    Person(name: "Bob", age: nil, city: "Croissant-ville"),
    Person(name: "Charlie", age: 30, city: "Baguette-ville"),
    Person(name: "David", age: nil, city: "Escargot-terre"),
    Person(name: "Eva", age: 22, city: "Fromage-sur-Ciel"),
    Person(name: "Frank", age: 40, city: "Tour-Eiffel-land"),
    Person(name: "Grace", age: 18, city: "Chapeau-Rouge")
]
  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

swift
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