Après avoir découvert les bases de Swift, je te propose de nous arrêter à présent dans l’univers des Collections. Swift en propose trois principaux types pour stocker des collections de valeurs :

  • Les tableaux (ou array) sont des collections ordonnées de valeurs
  • Les ensembles (ou sets) sont des collections non ordonnées de valeurs uniques
  • Les dictionnaires sont des collections non ordonnées d’associations clé-valeur
Illustration issue de la documentation officielle Apple

Tableaux 🖼️ Array

Un tableau stocke des valeurs du même type dans une liste ordonnée. La même valeur peut apparaître dans un tableau plusieurs fois à des positions différentes. L’index de départ d’un tableau, comme dans n’importe quel langage, est 0. C’est à dire que sa valeur sera stockée à la position 0.

Comment créer un tableau ?

// J'initialise le tableau à vide
let nomDuTableau: [TypeDesElements] = [] 
// ou 
// J'initialise le tableau typé avec des valeurs
let tableauDeNombres: [Int] = [1, 2, 3, 4, 5] 
//ou
// Pas de typage
var fruits = ["pomme", "banane", "orange"] 
// ou 
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles est de type [Double] par défaut et vaut [0.0, 0.0, 0.0]

Dans ce dernier exemple, je peux choisir de ne pas typer mon tableau, c’est donc Swift qui va le typer automatiquement en fonction des valeurs.

Pour accéder à la valeur d’une case du tableau :

var fruits = ["pomme", "banane", "orange"] 
print(fruits[0])
// Affiche : pomme

Pour ajouter des valeurs à mon tableau, j’utilise la fonction native de Swift append() :

fruits.append("fraise")
// ou
fruits += ["framboise"]
fruits += ["cassis"]
// ou
fruits[4...5] = ["raisin", "kiwi"]
// fruits contient maintenant 6 éléments, les 2 dernières valeurs ont été remplacées
//["pomme", "banane", "orange", "fraise", "raisin", "kiwi"]
fruits.insert("ananas", at: 0)
// insère à la position 0 mais ne remplace pas le premier élément. fruits contient 7 éléments

Pour supprimer une valeur :

let ananas = fruits.remove(at: 0)
// la valeur de la position 0 a été supprimée
let kiwi = fruits.removeLast()
// la dernière valeur du tableau a été supprimée

On verra dans l’article des boucles, comment parcourir un tableau.

Dictionnaires 📚 Dictionary

Avant de continuer, je voudrais te faire réfléchir à une question existentielle, que dis-je ! CRUCIALE !! Penses-tu qu’il est possible de mettre des dictionnaires dans des tableaux ? 🤨

Hihi, c’était trop facile. Blague à part, je réponds à cette question à la fin de l’article !

Le type d’un dictionnaire Swift s’écrit Dictionary<Key, Value> ou [Key : Value], où Key est le type de valeur qui peut être utilisé comme clé du dictionnaire, et Value est le type de valeur que le dictionnaire stocke pour ces clés.

var months: [Int: String] = [:]
months[1] = "Janvier"
// ou
var months: [Int: String] = [1 : "Janvier", 2 : "Février", 3 : "Mars"]

Les fonctions à connaître :

months.isEmpty // Booleen qui retourne true si le tableau est vide
months.count // Affiche le nombre de paires clé-valeur

Mettre à jour une valeur :

var airports: [String: String] = ["DUB": "Dublin"]
if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
    print("L'ancienne valeur pour DUB était \(oldValue).")
}
// Affiche "L'ancienne valeur pour DUB était Dublin."

Ensembles 🫂 Sets

Un ensemble stocke des valeurs distinctes du même type dans une collection sans ordre défini. Tu peux utiliser un ensemble au lieu d’un tableau lorsque l’ordre des éléments n’est pas important ou lorsque tu dois t’assurer qu’un élément n’apparaît qu’une seule fois.

Le type d’un ensemble Swift s’écrit Set<Element>, où Element est le type que l’ensemble est autorisé à stocker. Contrairement aux tableaux, les ensembles n’ont pas de forme abrégée équivalente.

var letters = Set<Character>()
var favoriteHeroes: Set = ["Iron Man", "Thor", "Spiderman"]

On retrouver les mêmes fonctions que pour les tableaux :

favoriteHeroes.insert("Captain Marvel") // ajouter un élément
var isFunk: Bool = favoriteHeroes.contains("Superman") 
// renvoie false car le tableau ne contient pas d'héros DC
favoriteHeroes.sorted() // ordonner l'ensemble alphabétiquement

Opérations courantes

Illustration issue de la documentation officielle Apple 

Il existe 4 opérations courantes qui peuvent être utilisées pour créer un nouvel ensemble :

  • intersection (_:) : pour créer un set à partir des valeurs communes aux deux sets
  • symmetricDifference(_:) : pour créer un set à partir des valeurs qui ne sont pas communes aux deux sets
  • union(_:) : pour créer un set à partir des valeurs des deux sets
  • subtracting(_:) : pour créer un set à partir des valeurs qui ne sont pas dans le set spécifié
let unite: Set = [1, 2, 3, 4, 5]
let dizaine: Set = [10, 20, 30, 40, 50]
let paires: Set = [2, 4, 6, 8, 10]
unite.union(dizaine).sorted()
// [1, 2, 3, 4, 5, 10, 20, 30, 40, 50]
unite.intersection(dizaine).sorted()
// []
unite.symmetricDifference(paires).sorted()
// [1, 3, 5, 6, 8, 10]
unite.subtracting(paires).sorted()
// [1, 3, 5]

D’autres fonctions natives utiles pour les ensembles :

  • isSubset(of:) : pour déterminer si toutes les valeurs d’un ensemble sont contenues dans l’ensemble spécifié.
  • isSuperset(of:) : pour déterminer si un ensemble contient toutes les valeurs d’un ensemble spécifié.
  • isStrictSubset(of:) ou isStrictSuperset(of:) : pour déterminer si un ensemble est un sous-ensemble ou un sur-ensemble, mais pas égal, d’un ensemble spécifié 🥴
  • isDisjoint(with:) : pour déterminer si deux ensembles n’ont aucune valeur en commun.
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true

Enumérations 📝 Enums

Une énumération définit un ensemble fini de valeurs possibles pour une variable ou une constante et nous permet d’utiliser ces valeurs de manière sûre dans notre code.

enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
//
enum Day {
    case monday
    case tuesday
    case wednesday
    case thursday
    case friday
    case saturday
    case sunday
}
var today = Day.monday
// ou
today = .tuesday // uniquement s'il a été déclaré comme un Day

Afin de répondre à toutes valeurs que pourrait prendre la variable today, on peut parcourir les conditions avec un switch/case :

switch today {
    case .monday:
        print("Je hais les lundis.")
    case .tuesday:
        print("Jour de flemme.")
    case .wednesday:
        print("Une pause s'impose.")
    case .thursday:
        print("J'aime travailler tous les jours.")
    //etc.
}

Pour bien comprendre le switch/case, tu peux le lire ainsi : « Prends la variable today, si elle vaut monday, affiche « Je hais les lundis », si elle vaut tuesday … etc. »


Merci d’avoir lu cet article jusqu’au bout. J’espère qu’il t’a plu ! J’ai pris beaucoup de plaisir à l’écrire en tout cas. Mais avant de se quitter, je réponds à cette question qui, j’en suis sûre, te taraude depuis quelques lignes maintenant… Est-il possible de mettre un dictionnaire dans un tableau ?

La réponse est oui 🥹

let personnePref1 = ["nom": "Jean", "age": "30"]
let personnePref2 = ["nom": "Marie", "age": "25"]
var tousMesPref: [[String: String]] = [personnePref1, personnePref2]
// Tableau contenant les 2 dictionnaires
let personnePref3 = ["nom": "Pierre", "age": "35"]
tousMesPref.append(personnePref3)
// J'ajoute un nouveau dictionnaire au tableau
for personne in tousMesPref {
    print("Nom: \(personne["nom"]!), Age: \(personne["age"]!)")
} // Je parcours tous les éléments de mon tableau
// Affiche :
// Nom: Jean, Age: 30
// Nom: Marie, Age: 25
// Nom: Pierre, Age: 35

Sur cette petite pointe d’humour 🤓 je te retrouve bientôt pour te parler des fonctions et closures en Swift.

En attendant, dis nous en commentaire ce que tu aimerais coder avec Swift !

Si tu as aimé cet article, partage le 🫶