在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)。然后它应该跳过“斐波那契”中的任何数字,因为这些数字都小于最大的数字,目前从“素数”开始设置为13。然后,将其设置为16,最后在“Square”中设置为25,总共产生8次。

我是不是忽略了一些显而易见的东西?

258855 次浏览

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

这个打印:

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

结果是

< p >(“FirstName”、“Maninder”) (“姓”,“辛格”) (“地址”,“昌迪加尔”)< / p >

这是一个用户定义的遍历字典的函数:

func findDic(dict: [String: String]) {
for (key, value) in dict {
print("\(key) : \(value)")
}
}


findDic(dict: ["Animal": "Lion", "Bird": "Sparrow"])
// prints…
// Animal : Lion
// Bird : Sparrow

如果你想遍历所有的值:

dict.values.forEach { value in
// print(value)
}

你也可以使用values.makeIterator()来遍历字典值,如下所示:

for sb in sbItems.values.makeIterator(){
// do something with your sb item..
print(sb)
}

你也可以这样做迭代,在一个更快速的风格:

sbItems.values.makeIterator().forEach{
// $0 is your dict value..
print($0)
}

sbItems是类型为[String : NSManagedObject]的字典