我学习迅速并试图理解词典。我已经习惯了PHP,你可以写下以下内容......
$dataPoints = Array("A"=>1,"B"=>2,"C"=>3);
foreach($dataPoints as $value) {
echo($value);
}
在此示例中,值将按顺序输出 - 1,2,3
我的快速代码看起来像这样......
var dataPoints: Dictionary<String,Int> = ["A":1,"B":2,"C":3]
for (key, value) in dataPoints {
print(value)
}
但是,这些值会以意想不到的顺序出现。有什么东西可以做,以保持值的创建顺序,或者一个快速的字典永远不会被排序?
答案 0 :(得分:7)
正如已经回答的那样,字典的意思是它没有排序。 Swift(和Objective-C)中有三种类型的集合
数组是一个有序的项目列表。当项目的顺序很重要时使用它。
字典是键和值的无序集合。如果要根据键有效地检索值,请使用此选项。
套装是一包无序的独特物品。如果您想要一组没有特定顺序的唯一项目,请使用此选项。
对于您的情况,似乎排序对您来说很重要,但您希望存储某种值的值。也许您应该关注的是使用一组元组:
像这样的东西,也许let dataPoints = [("A", 1), ("B", 2), ("C", 3)]
for (letter, number) in dataPoints {
print("\(letter), \(number)")
}
输出
A, 1
B, 2
C, 3
<强>替代地强>
如果您在创建项目之前不知道项目的顺序,但是基于这些项目有自然顺序,您可以这样做:
let dict = [
"A" : 1,
"B" : 2,
"C" : 3
]
for key in dict.keys.sort() {
guard let value = dict[key] else { break }
print("\(key), \(value)")
}
在这种情况下,您将获得一组具有默认排序顺序的键(如果您有其他要求,可以使用不同的排序函数)并根据排序顺序输出键值。
答案 1 :(得分:4)
来自Apple docs:
与数组中的项目不同,字典中的项目没有指定的顺序。
所以,不,Swift词典永远不会“排序”。但是,谷歌快速搜索“Swift有序词典”将产生一些可满足您需求的实现:
例如:
https://github.com/lukaskubanek/OrderedDictionary
https://github.com/Marxon13/M13DataStructures/blob/master/Classes/OrderedDictionary.swift
Cocoapods也可以提供帮助:
答案 2 :(得分:1)
在Swift 4中,您可以使用sorted(by:)
返回字典元素(元组)的排序数组。因此,您问题中的代码变为:
var dataPoints = ["A":1,"B":2,"C":3]
var sortedDataPoints = dataPoints.sorted(by: { $0.value < $1.value })
// [(key: "A", value: 1), (key: "B", value: 2), (key: "C", value: 3)]
for (_, value) in sortedDataPoints {
print(value)
}
答案 3 :(得分:1)
您现在可以使用官方 Apple Collections 库中的 OrderedDictionary: https://github.com/apple/swift-collections
答案 4 :(得分:0)
以防这是有用的,基于这里的响应,因为我从JSON源接收数据,我认为最好的方法是将我的字典转换为元组的排序数组。我为此创建了以下函数:
func dictionary_to_sorted_array(dict:Dictionary<String,Int>) ->Array<(key:String,value:Int)> {
var tuples: Array<(key:String,value:Int)> = Array()
let sortedKeys = (dict as NSDictionary).keysSortedByValueUsingSelector("compare:")
for key in sortedKeys {
tuples.append((key:key as! String,value:dict[key as! String]!))
}
return tuples
}
那么,我可以使用以下代码:
var dataPoints: Dictionary<String,Int> = ["A":1,"B":2,"C":3]
dataPointsArray(dictionary_to_sorted_array(dataPoints))
for dataPoint in dataPointsArray {
print(dataPoint.value)
}
我非常喜欢swift的初学者,所以如果有人能更快地做到这一点,那就太棒了!