Iterando a través de un diccionario en Swift

Resuelto Nick Kohrn asked hace 10 años • 6 respuestas

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 largestse 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?

Nick Kohrn avatar Jun 09 '14 05:06 Nick Kohrn
Aceptado

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
Dash avatar Jun 08 '2014 22:06 Dash
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")

Maninderjit Singh avatar Jun 22 '2017 07:06 Maninderjit Singh

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
Rawand Saeed avatar Oct 30 '2018 11:10 Rawand Saeed

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
jabbyApps avatar Oct 12 '2016 17:10 jabbyApps