在Swift中迭代一个字典

对于Xcode在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 

我知道,当字典被横穿时,最大的数字被设置为largest的variables。 然而,我很困惑,为什么Xcode是说, largest的被设置5次,或1次,或3次,取决于每个testing。

在查看代码时,我发现应该在“Prime”中设置6次(2,3,5,7,11,13)。 那么它应该跳过“斐波纳契”中的所有数字,因为这些数字都小于最大值,目前从“Prime”设置为13。 然后在“方”中设定为16,最后25,共计8次。

我错过了一些完全明显的东西?

Swift(和其他语言)中的字典没有sorting。 当你遍历字典时,没有保证顺序将匹配初始化顺序。 在这个例子中,Swift先处理“Square”键。 您可以通过向循环添加打印语句来看到这一点。 25是方形的第5个元素,所以最大的5个元素在Square中设置5次,然后停留在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 

这打印:

 kind: Square kind: Prime kind: Fibonacci 

这是一个替代实验(Swift 3.0)。 这告诉你哪一种数字是最大的。

 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) } 

结果会是

(“FirstName”,“Maninder”)(“LastName”,“Singh”)(“Address”,“Chandigarh”)

数组是有序的集合,但是字典和集合是无序的集合。 因此,你无法预测字典或集合中迭代的顺序。

阅读这篇文章,以了解更多关于集合types:Swift编程语言