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?

174
demandé sur Nick Kohrn 2014-06-09 02:42:54

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
280
répondu Dash 2015-10-04 02:25:53
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")

9
répondu Maninderjit Singh 2017-06-22 07:26:55

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
8
répondu jabbyApps 2016-10-12 17:19:07

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

2
répondu Rachit Rawat 2016-04-24 19:48:20