Je suis un peu confus quant à la réponse fournie par Xcode à cette expérience dans le Swift Guide du langage de programmation:
// 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 qu’au fur et à mesure que le dictionnaire est en train de se croiser, le plus grand nombre est défini sur la variable largest
. Cependant, je ne comprends pas pourquoi Xcode dit que largest
est défini 5 fois, 1 fois ou 3 fois, en fonction de 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 faut ignorer tous les chiffres de "Fibonacci", car ceux-ci sont tous inférieurs au plus grand, qui est actuellement défini à 13 sur "Prime". Ensuite, il devrait être réglé à 16, et enfin 25 dans "Square", donnant un total de 8 fois.
Est-ce que je manque quelque chose de tout à fait évident?
Les dictionnaires de Swift (et d'autres langues) ne sont pas ordonnés. Lorsque vous parcourez le dictionnaire, rien ne garantit que l'ordre correspondra à l'ordre d'initialisation. Dans cet exemple, Swift traite la touche "Carré" avant les autres. Vous pouvez le voir en ajoutant une instruction print à la boucle. 25 est le 5ème élément de Square, donc le plus grand serait défini 5 fois pour les 5 éléments de Square et resterait ensuite à 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
Cela imprime:
kind: Square kind: Prime kind: Fibonacci
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
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")
C'est une fonction définie par l'utilisateur pour parcourir un dictionnaire:
func findDic(dict: [String: String]){
for (key, value) in dict{
print("\(key) : \(value)")
}
}
findDic(dict: ["Animal":"Lion", "Bird":"Sparrow"])
//prints Animal : Lion
Bird : Sparrow
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 collections: Swift Langage de programmation
Si vous voulez parcourir toutes les valeurs:
dict.values.forEach { value in
// print(value)
}
Vous pouvez également utiliser values.makeIterator()
pour parcourir les valeurs dict, comme ceci:
for sb in sbItems.values.makeIterator(){
// do something with your sb item..
print(sb)
}
Vous pouvez aussi faire l'itération comme ceci, dans un style plus rapide:
sbItems.values.makeIterator().forEach{
// $0 is your dict value..
print($0)
}
* sbItems
est un dict de type [String : NSManagedObject]