小编典典

在 Swift 中遍历字典

all

我对 Xcode 在 Swift Programming Language Guide 中给我的这个实验的答案有点困惑:

// 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 次。

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


阅读 70

收藏
2022-05-17

共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
2022-05-17