在Swift中通过字典迭代

时间:2014-06-08 22:42:55

标签: dictionary 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)。然后它应该跳过" Fibonacci"中的任何数字。因为这些都是最小的,目前从#34; Prime"设置为13。然后,它应该设置为16,最后25 in" Square",总共产生8次。

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

7 个答案:

答案 0 :(得分:317)

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

答案 1 :(得分:10)

这是该实验的替代方案(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

答案 2 :(得分:10)

let dict : [String : Any] = ["FirstName" : "Maninder" , "LastName" : "Singh" , "Address" : "Chandigarh"]
dict.forEach { print($0) }

结果将是

(" FirstName"," Maninder") ("姓氏","辛格") ("地址"," Chandigarh")

答案 3 :(得分:4)

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

阅读本文以了解更多信息 Collection Types: Swift Programming Language

答案 4 :(得分:4)

这是用户定义的函数,用于遍历字典:

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

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

答案 5 :(得分:2)

如果要遍历所有值:

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

答案 6 :(得分:0)

您还可以使用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]的字典