一尘不染

在Swift中遍历字典

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。但是,我对为什么Xcode会说要largest根据每次测试设置5次,1次或3次感到困惑。

查看代码时,我发现应该单独在“
Prime”中将其设置6次(2、3、5、7、11、13)。然后,它应该跳过“斐波那契”中的任何数字,因为这些数字都小于最大数字,该数字当前已从“
Prime”设置为13。然后,将其设置为16,最后在“ Square”中设置为25,总共产生8次。

我是否缺少一些显而易见的东西?


阅读 495

收藏
2020-07-07

共1个答案

一尘不染

Swift(和其他语言)的字典不排序。当您遍历字典时,没有保证该顺序将与初始化顺序匹配。在此示例中,Swift先处理“
Square”键。您可以通过在循环中添加打印语句来查看此信息。25是Square的第5个元素,因此将Square中的5个元素设置为最大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
2020-07-07