Les dictionnaires sont l'un des principaux types de collection de Swift. Un dictionnaire stocke des associations non ordonnées entre des clés uniques et les valeurs correspondantes. Toutes les clés d'un dictionnaire doivent être du même type, et toutes les valeurs doivent elles aussi partager le même type.
Les littéraux de dictionnaire s'écrivent sous la forme de paires key: value séparées par des virgules et entourées de crochets :
var addresses: Dictionary<String, String> = [
"The Munsters": "1313 Mockingbird Lane",
"The Simpsons": "742 Evergreen Terrace",
"Buffy Summers": "1630 Revello Drive"
]
var sequences: [String: [Int]] = [
"Euler's totient": [1, 1, 2, 2, 4, 2, 6, 4],
"Lazy caterer": [1, 2, 4, 7, 11, 16, 22, 29, 37],
"Carmichael": [561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841]
]
let constants = [
"pi": 3.14159,
"e": 2.71828,
"phi": 1.618033,
"avogadro": 6.02214076e23
]
Les types de dictionnaire peuvent s'écrire explicitement de deux manières : Dictionary<Key, Value> ou la syntaxe abrégée [Key: Value].
Pour créer un dictionnaire vide, précise explicitement les types de ses clés et de ses valeurs :
var emptyDict1: [Int: Int] = [:]
var emptyDict2 = [Character: String]()
var emptyDict3 = Dictionary<Int, Double>()
On peut accéder aux valeurs à l'aide de la notation par indice : place la clé entre crochets après le nom du dictionnaire.
Comme une clé peut ne pas exister dans le dictionnaire, l'accès par indice renvoie une valeur optionnelle (Value?).
Si la clé est présente, Swift renvoie la valeur encapsulée ; sinon, il renvoie nil :
let munster: String? = addresses["The Munsters"]
// Returns Optional("1313 Mockingbird Lane")
let carmichael = sequences["Carmichael"]
// Returns Optional([561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841])
let planck = constants["planck"]
// Returns nil
Pour éviter de manipuler des optionnels, on peut fournir une valeur par défaut à l'aide du paramètre default :
let e: Double = constants["e", default: 0]
// Returns 2.71828
let hoagie: [Int] = sequences["Hoagie", default: []]
// Returns []
let betty = addresses["Betty Cooper", default: "Address unknown"]
// Returns "Address unknown"
Pour les dictionnaires mutables déclarés avec var, tu peux ajouter ou mettre à jour des paires clé-valeur à l'aide d'une affectation par indice :
sequences["Euler's totient"]?.append(contentsOf: [6, 4])
// sequences["Euler's totient"] is now [1, 1, 2, 2, 4, 2, 6, 4, 6, 4]
addresses["Betty Cooper"] = "111 Queens Ave."
addresses["Betty Cooper", default: "Address unknown"]
// Returns "111 Queens Ave."
constants["Gelfond's"] = 23.140692
// Compiler error: Cannot assign through subscript: 'constants' is a 'let' constant
On peut parcourir chaque paire clé-valeur d'un dictionnaire à l'aide d'une boucle for-in.
Chaque élément est fourni sous forme de tuple (key, value) :
for (name, address) in addresses {
print("\(name) lives at \(address)")
}
Comme les dictionnaires ne sont pas ordonnés, les trier produit un tableau de paires clé-valeur.
On peut passer une closure à la méthode sorted(by:) qui compare deux tuples (key, value) et renvoie true si le premier tuple doit apparaître avant le second :
func sortByNameLengthThenValue(_ lhs: (key: String, value: Double), _ rhs: (key: String, value: Double)) -> Bool {
let left = lhs.value + Double(lhs.key.count)
let right = rhs.value + Double(rhs.key.count)
return left < right
}
let sortedConstants = constants.sorted(by: sortByNameLengthThenValue)
Dans cet exercice, tu vas mettre en place un moyen de suivre les meilleurs scores du jeu le plus populaire de la salle d'arcade de ta ville.
Tu as 7 fonctions à implémenter, toutes liées au renvoi et à la manipulation d'un dictionnaire de données de meilleurs scores.
Crée une fonction newScoreBoard() qui ne prend aucun paramètre et qui renvoie un nouveau dictionnaire des meilleurs scores, dont les clés sont de type String et les valeurs de type Int.
Pour ajouter un joueur au dictionnaire des meilleurs scores, définis addPlayer(_:_:_:), une fonction qui prend 3 paramètres :
var highScores = newScoreBoard()
addPlayer(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0]
addPlayer(&highScores, "José Valim", 486_373)
// Returns ["Dave Thomas": 0, "José Valim": 486_373]
Pour supprimer un joueur du dictionnaire des meilleurs scores, définis removePlayer(_:_:), qui prend 2 paramètres :
Cette fonction doit supprimer le joueur du dictionnaire s'il s'y trouve, et ne rien faire dans le cas contraire.
var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
removePlayer(&highScores, "Dave Thomas")
// Returns ["José Valim": 486_373]
removePlayer(&highScores, "Rose Fanaras")
// Returns ["José Valim": 486_373]
Pour réinitialiser le score d'un joueur, définis resetPlayer(_:_:), qui prend 2 paramètres :
La fonction met le score du joueur à 0. Si le joueur n'est pas dans le dictionnaire, il ne doit rien se passer.
var highScores = ["Dave Thomas": 486_373, "José Valim": 10]
resetScore(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0, "José Valim": 10]
Pour mettre à jour le score d'un joueur en l'ajoutant au score précédent, définis updateScore, qui prend 3 paramètres :
var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
addPlayer(&highScores, "Freyja Ćirić", 12_771_008)
updateScore(&highScores, "Freyja Ćirić", 73)
// Returns ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_081]
Définis la fonction orderByPlayers, qui prend 1 paramètre :
La fonction renvoie un tableau de tuples (String, Int), à savoir les joueurs et leurs meilleurs scores, triés par ordre croissant du nom du joueur.
var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByPlayers(highScores)
// Returns [("Dave Thomas", 0), ("Freyja Ćirić", 12_771_091), ("José Valim", 486_373)]
Pour obtenir la liste des joueurs classés par score décroissant, définis orderByScores, qui prend 1 paramètre :
La fonction renvoie un tableau de tuples (String, Int), à savoir les joueurs et leurs meilleurs scores, triés par ordre décroissant du score du joueur.
var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByScores(highScores)
// Returns [("Freyja Ćirić", 12_771_091), ("José Valim", 486_373), ("Dave Thomas", 0)]
Inscris-toi sur Exercism pour apprendre et maîtriser Swift avec 35 concepts116 exercices, et un vrai mentorat humain, le tout gratuitement.