Iterando a través de un diccionario en Swift
Estoy un poco confundido con la respuesta que Xcode me está dando a este experimento en la Guía del lenguaje de programación Swift:
// Use a for-in to iterate through a dictionary (experiment)
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
largest
Entiendo que a medida que se recorre el diccionario, el número más grande se establece en la variable largest
. Sin embargo, no entiendo por qué Xcode dice que largest
se configura 5 veces, 1 vez o 3 veces, dependiendo de cada prueba.
Al revisar el código, veo que debería configurarse 6 veces solo en "Prime" (2, 3, 5, 7, 11, 13). Entonces debería omitir cualquier número en "Fibonacci", ya que todos son menores que el más grande, que actualmente está establecido en 13 desde "Prime". Luego, se debe fijar en 16, y finalmente en 25 en "Cuadrado", dando un total de 8 veces.
¿Me estoy perdiendo algo completamente obvio?
Los diccionarios en Swift (y otros idiomas) no están ordenados. Cuando recorre el diccionario en iteración, no hay garantía de que el orden coincida con el orden de inicialización. En este ejemplo, Swift procesa la clave "Cuadrado" antes que las demás. Puede ver esto agregando una declaración de impresión al bucle. 25 es el quinto elemento de Square, por lo que el más grande se establecería 5 veces para los 5 elementos de Square y luego permanecería en 25.
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25]
]
var largest = 0
for (kind, numbers) in interestingNumbers {
println("kind: \(kind)")
for number in numbers {
if number > largest {
largest = number
}
}
}
largest
Esto imprime:
kind: Square kind: Prime kind: Fibonacci
let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
dict.forEach { print($0) }
El resultado sería
("Nombre", "Maninder") ("Apellido", "Singh") ("Dirección", "Chandigarh")
Esta es una función definida por el usuario para iterar a través de un diccionario:
func findDic(dict: [String: String]) {
for (key, value) in dict {
print("\(key) : \(value)")
}
}
findDic(dict: ["Animal": "Lion", "Bird": "Sparrow"])
// prints…
// Animal : Lion
// Bird : Sparrow
Aquí hay una alternativa para ese experimento (Swift 3.0). Esto te dice exactamente qué tipo de número fue el mayor.
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
var whichKind: String? = nil
for (kind, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
whichKind = kind
largest = number
}
}
}
print(whichKind)
print(largest)
OUTPUT:
Optional("Square")
25