web-dev-qa-db-fra.com

Itérer dans un dictionnaire dans Swift

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?

197
Nick Kohrn

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
323
Dash

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
11
jabbyApps
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")

11
Maninderjit Singh

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
5
Rawand Saeed

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

4
Rachit Rawat

Si vous voulez parcourir toutes les valeurs:

dict.values.forEach { value in
    // print(value)
}
2
norbDEV

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]

0
Yonatan Goriachnick