我对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
我知道当字典被横切时,最大的数字被设置为变量,最大。然而,我很困惑,为什么Xcode说最大值要设置5次,或1次,或3次,这取决于每次测试。
当查看代码时,我看到它应该在“Prime”中单独设置6次(2,3,5,7,11,13)。然后它应该跳过“斐波那契”中的任何数字,因为这些数字都小于最大的数字,目前从“素数”开始设置为13。然后,将其设置为16,最后在“Square”中设置为25,总共产生8次。
我是不是忽略了一些显而易见的东西?
Swift(和其他语言)的字典没有排序。在遍历字典时,不能保证顺序与初始化顺序匹配。在这个例子中,Swift先处理“Square”键。您可以通过向循环中添加print语句来查看这一点。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
这个打印:
:广场
: '
:斐波那契
Swift(和其他语言)的字典没有排序。在遍历字典时,不能保证顺序与初始化顺序匹配。在这个例子中,Swift先处理“Square”键。您可以通过向循环中添加print语句来查看这一点。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
这个打印:
:广场
: '
:斐波那契
下面是这个实验的替代方案(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