在Swift中遍历字典


220

我对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”(2、3、5、7、11、13)中将其设置6次。然后,它应该跳过“斐波那契”中的任何数字,因为这些数字均小于最大数字,该数字当前已从“高级”设置为13。然后,应将其设置为16,最后在“ Square”中设置为25,总共产生8次。

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

Answers:


354

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

1
非常感谢!我被困了一段时间。我一直在为每个键添加和删除数字,以期对其进行剖析,但是我却一无所获。您的解释很明确,非常感谢!
Nick Kohrn 2014年

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

结果将是

(“名字”,“ Maninder”)(“姓氏”,“辛格”)(“地址”,“昌迪加尔”)


您能告诉我这个示例在1,000个数据循环中是否更有效?因为我有一个很大的JSON,所以最后需要我进行1GB的处理。较新的设备不会崩溃,但在我的iphone 5s 16GB中,崩溃的一半。
Daniel Arantes Loverde

鉴于最初的问题是有关字典是否保持顺序的问题,这似乎有点误导,然后您发布一个示例,说明字典是否保持顺序。
Declan McKenna

12

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

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

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

11

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

8

如果要遍历所有值:

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

我非常讨厌这个事实,这是正确的。在愚蠢的乔达说话的迅速创造者,每个人都必须说话!🤮
塞巴斯蒂安


1

您还可以values.makeIterator()用于遍历dict值,如下所示:

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]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.