Itérer à travers un dictionnaire dans Swift
Je suis un peu confus sur la réponse que Xcode me donne à cette expérience dans le Guide Du Langage de programmation 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
Je comprends que lorsque le dictionnaire est transversal, le plus grand nombre est défini sur la variable, largest
. Cependant, je suis confus quant à la raison pour laquelle Xcode dit que largest
est défini 5 fois, ou 1 fois, ou 3 fois, selon chaque test.
En regardant à travers le code, je vois qu'il devrait être réglé 6 fois dans" Prime " seul (2, 3, 5, 7, 11, 13). Ensuite, il devrait sauter tous les nombres dans "Fibonacci" puisque ceux-ci sont tous inférieurs au plus grand, qui est actuellement défini sur 13 à partir de "Prime". Ensuite, il devrait être réglé sur 16, et enfin 25 dans "Carré", ce qui donne un total de 8 fois.
Est-ce que je manque quelque chose de tout à fait évident?
4 réponses
Les Dictionnaires Swift (et d'autres langues) ne sont pas ordonnés. Lorsque vous parcourez le dictionnaire, Il n'y a aucune garantie que l'ordre correspondra à l'ordre d'initialisation. Dans cet exemple, Swift traite la clé" carré " avant les autres. Vous pouvez le voir en ajoutant une instruction print à la boucle. 25 est le 5ème élément du carré, donc le plus grand serait défini 5 fois pour les 5 éléments du carré, puis resterait à 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
Cette impression:
kind: Square kind: Prime kind: Fibonacci
let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
dict.forEach { print($0) }
Le résultat serait
("Prénom", " Maninder") ("Nom", "Singh") ("Adresse", "Chandigarh")
Voici une alternative pour cette expérience (Swift 3.0). Cela vous indique exactement quel type de nombre était le plus grand.
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
Les tableaux sont des collections ordonnées, mais les dictionnaires et les ensembles sont des collections non ordonnées. Ainsi, vous ne pouvez pas prédire l'ordre d'itération dans un dictionnaire ou un ensemble.
Lisez cet article pour en savoir plus sur Types De Collection: Langage De Programmation Swift