Los diccionarios son uno de los tipos de colección principales de Swift. Un diccionario almacena asociaciones no ordenadas entre claves únicas y sus valores correspondientes. Todas las claves de un diccionario deben ser del mismo tipo, y todos los valores también deben compartir el mismo tipo.
Los literales de diccionario se escriben como pares key: value separados por comas y encerrados entre corchetes:
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
]
Los tipos de diccionario se pueden escribir explícitamente de dos formas: Dictionary<Key, Value> o la sintaxis abreviada [Key: Value].
Para crear un diccionario vacío, especifica explícitamente sus tipos de clave y de valor:
var emptyDict1: [Int: Int] = [:]
var emptyDict2 = [Character: String]()
var emptyDict3 = Dictionary<Int, Double>()
Puedes acceder a los valores usando la notación de subíndice: coloca la clave entre corchetes después del nombre del diccionario.
Como es posible que una clave no exista en el diccionario, el acceso por subíndice devuelve un opcional (Value?).
Si la clave está presente, Swift devuelve el valor envuelto; si no, devuelve 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
Para no tener que trabajar con opcionales, puedes proporcionar un valor por defecto usando el parámetro 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"
En los diccionarios mutables declarados con var, puedes añadir o actualizar pares clave-valor mediante la asignación por subíndice:
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
Puedes iterar sobre cada par clave-valor de un diccionario con un bucle for-in.
Cada elemento se proporciona como una tupla (key, value):
for (name, address) in addresses {
print("\(name) lives at \(address)")
}
Como los diccionarios no tienen orden, al ordenarlos se obtiene un array de pares clave-valor.
Puedes pasar un closure al método sorted(by:) que compare dos tuplas (key, value) y devuelva true si la primera tupla debe aparecer antes que la segunda:
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)
En este ejercicio vas a implementar una forma de llevar un registro de las puntuaciones máximas del juego más popular de tu salón recreativo.
Tienes que implementar 7 funciones, todas relacionadas con devolver y manipular un diccionario de datos de puntuaciones máximas.
Crea una función newScoreBoard() que no reciba parámetros y devuelva un nuevo diccionario de puntuaciones máximas que use valores de tipo String para las claves y valores de tipo Int como valores.
Para añadir un jugador al diccionario de puntuaciones máximas, define addPlayer(_:_:_:), una función que recibe 3 parámetros:
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]
Para eliminar a un jugador del diccionario de puntuaciones máximas, define removePlayer(_:_:), que recibe 2 parámetros:
Esta función debe eliminar al jugador del diccionario si está en él y no hacer nada en caso contrario.
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]
Para restablecer la puntuación de un jugador, define resetPlayer(_:_:), que recibe 2 parámetros:
La función establecerá la puntuación del jugador a 0. Si el jugador no está en el diccionario, no debe pasar nada.
var highScores = ["Dave Thomas": 486_373, "José Valim": 10]
resetScore(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0, "José Valim": 10]
Para actualizar la puntuación de un jugador sumándola a la puntuación anterior, define updateScore, que recibe 3 parámetros:
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]
Define la función orderByPlayers, que recibe 1 parámetro:
La función devolverá un array de tuplas (String, Int) que son los jugadores y sus puntuaciones máximas, ordenado de forma ascendente por el nombre del jugador.
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)]
Para obtener un array de jugadores ordenado por puntuaciones de forma descendente, define orderByScores, que recibe 1 parámetro:
La función devolverá un array de tuplas (String, Int) que son los jugadores y sus puntuaciones máximas, ordenado de forma descendente por la puntuación del jugador.
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)]
Regístrate en Exercism para aprender y dominar Swift con 35 conceptos116 ejercicios y mentoría humana real, todo gratis.