Les dictionnaires en langage Swift sont des structures de données très pratiques pour stocker des informations sous forme de clés et de valeurs. Ils permettent de stocker des données de manière efficace et de les récupérer rapidement en utilisant des clés uniques. Nous allons explorer les différentes façons de créer et d'utiliser les dictionnaires en Swift, ainsi que les fonctionnalités avancées qui les rendent si puissants. Nous verrons comment ajouter, supprimer et mettre à jour des éléments, comment parcourir les éléments d'un dictionnaire et comment utiliser les dictionnaires pour résoudre des problèmes courants de programmation.

Création d'un dictionnaire

Création d'un dictionnaire vide :


var namesOfIntegers = [Int: String]()
// Nous venons de créer un dictionnaire vide

namesOfIntegers[16] = "sixteen"  
// Maintenant, il contient 1 paire clé-valeur

namesOfIntegers = [:]  
// namesOfIntegers est désormais un dictionnaire vide de type [Int: String]

Création d'un dictionnaire avec différentes clés-valeurs :


var airports: [String: String] = ["PRR": "Paris", "DUB": "Dublin"]

Comme les tableaux (Array), un dictionnaire peut-être déclaré sous forme de constante ou de variable. Dans l'exemple ci-dessus, les clés sont du type String et les valeurs sont du type String.


var airports = ["PRR": "Paris", "DUB": "Dublin"]  
// Plus rapide, le type est déduit automatiquement
Étant donné que toutes les clés du littéral sont du même type les unes que les autres et que toutes les valeurs sont du même type les unes que les autres, Swift peut en déduire que c'est le type correct à utiliser pour le dictionnaire de type [String: String].

Lire et modifier un dictionnaire

Compter le nombre d'élément clés-valeurs d'un dictionnaire


airports.count  
// Le dictionnaire contient 2 éléments

Vérifier si un dictionnaire est vide


if airports.isEmpty {
    // count = 0, dictionnaire vide
    print("Le dictionnaire est vide")
} else {
    print("Le dictionnaire contient un élément au minimum")
}
// Cela affiche : "Le dictionnaire contient un élément au minimum"

Ajouter ou modifier l'élément d'un dictionnaire

Vous pouvez ajouter un nouvel élément à un dictionnaire avec une syntaxe d'indice. Utilisez une nouvelle clé du type approprié comme index d'indice et affectez une nouvelle valeur du type approprié :


airports["LHR"] = "London"  

airports["LHR"] = "Heathrow"  
// Modifie une valeur existante

Au lieu de l'indice, utilisez la méthode updateValue(_:forKey:) d'un dictionnaire pour définir ou mettre à jour la valeur d'une clé particulière. La méthode updateValue(_:forKey) définit une valeur pour une clé s'il n'y en a pas, ou met à jour la valeur si cette clé existe déjà.

Contrairement à un indice, la méthode updateValue(_:forKey:) renvoie l'ancienne valeur après avoir effectué une mise à jour. Cela vous permet de vérifier si une mise à jour a eu lieu ou non.

La méthode updateValue(_:forKey:) renvoie une valeur facultative du type de valeur du dictionnaire. Pour un dictionnaire qui stocke des valeurs String, par exemple, la méthode renvoie une valeur de type String? ou "String optional". Cette valeur facultative contient l'ancienne valeur de cette clé s'il en existait une avant la mise à jour ou nil si aucune valeur n'existait :


if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
    print("L'ancienne valeur pour la clé : DUB est \(oldValue).")
}  // Cela affiche : "L'ancienne valeur pour la clé : DUB est Dublin."

Utilisez la syntaxe d'indice pour récupérer une valeur du dictionnaire pour une clé particulière. Comme il est possible de demander une clé pour laquelle aucune valeur n'existe, l'indice d'un dictionnaire renvoie une valeur optionnelle du type de valeur du dictionnaire. Si le dictionnaire contient une valeur pour la clé demandée, l'indice renvoie une valeur facultative contenant la valeur existante pour cette clé. Sinon, l'indice renvoie nil :


if let airportName = airports["DUB"] {
    print("Le nom de l'aéroport est \(airportName).")
} else {
    print("Cet aéroport n'est pas dans notre dictionnaire")
}
// Cela affiche "Le nom de l'aéroport est Dublin Airport."

Supprimer un élément du dictionnaire

Vous pouvez utiliser la syntaxe d'indice pour supprimer une paire clé-valeur d'un dictionnaire en attribuant la valeur nil à cette clé :


airports["APL"] = "Apple International" 
//  On insert un nouvel élément

airports["APL"] = nil  
// Puis APL est supprimé du dictionnaire

Ou la méthode removeValue(forKey:) :


if let removedValue = airports.removeValue(forKey: "DUB") {
    print("Le nom de l'aéroport supprimer est \(removedValue).")
} else {
    print("Notre dictionnaire ne contient pas de valuer pour la clé DUB")
}
// Cela affiche "Le nom de l'aéroport supprimer est Dublin Airport."

Parcourir un dictionnaire

Chaque élément du dictionnaire est retourné sous forme de tuple (clé, valeur).


for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
// LHR: London Heathrow
// YYZ: Toronto Pearson

Vous pouvez également récupérer une collection itérable des clés ou des valeurs d'un dictionnaire en accédant à ses propriétés keys et values :


for airportCode in airports.keys {
    print("Code de l'aéroport : \(airportCode)")
}
// Code de l'aéroport : LHR 
// Code de l'aéroport : YYZ

for airportName in airports.values {
    print("Nom de l'aéroport : \(airportName)")
}
// Nom de l'aéroport : London Heathrow
// Nom de l'aéroport : Toronto Pearson

Si vous avez besoin d'utiliser les clés ou les valeurs d'un dictionnaire avec une API qui prend une instance Array, initialisez un nouveau tableau avec la propriété keys ou values :


let airportCodes = [String](airports.keys)
// airportCodes vaut ["LHR", "YYZ"]

let airportNames = [String](airports.values)
// airportNames vaut ["London Heathrow", "Toronto Pearson"]

Itération d'un dictionnaire :

Vous pouvez également parcourir un dictionnaire pour accéder à ses paires clé-valeur. Chaque élément du dictionnaire est renvoyé sous la forme d'un tuple lorsque le dictionnaire est itéré, et vous pouvez décomposer les membres du tuple en tant que constantes explicitement nommées à utiliser dans le corps de la boucle


let numberOfLegs = ["araignée": 8, "fourmi": 6, "chat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName) possède \(legCount) pattes")
}
// chat possède 4 pattes
// fourmi possède 6 pattes
// araignée possède 8 pattes

Le contenu d'un dictionnaire est intrinsèquement non ordonné, et, lors de son itération, rien ne garantit l'ordre dans lequel il sera récupéré. En particulier, l'ordre dans lequel vous insérez les éléments dans un dictionnaire ne définit pas l'ordre dans lequel ils sont itérés.