检查以下字典:
var testDict: [String : Int] = [
"a" : 1,
"b" : 2,
"c" : 3,
"d" : 4
]
现在,遍历字典的键:
for i in testDict.keys {
print(i)
}
这会生成以下输出:
b a c d
但是,预期输出将是编码顺序中的键:
a b c d
由于情况并非如此,我假设密钥已排序。如果是这样,它们如何排序,更重要的是,它们如何返回到它们的编写顺序?
答案 0 :(得分:4)
来自Apple's docs:
与数组中的项目不同,字典中的项目没有 指定的订单
简而言之,字典项目没有排序,它们的hashValue尽可能有效地存储(你不应该对订单做任何假设),这就是原因:
字典密钥类型必须符合Hashable协议,如a 设置值类型。
对于第二个问题,由于字典未排序,因此您无法将值或键内部返回到原始顺序(因为它没有任何内容)。您可以做的是按特定顺序遍历所有值和键,如下所示:
let dic = ["a" : 1, "b" : 2, "c" : 3, "d" : 4]
for key in dic.keys.sort(<) {
print("key: \(key), value: \(dic[key])")
}
答案 1 :(得分:0)
字典(Swift或NSDictionary
)是键值映射。概念没有顺序。您输入一个值(键)并为该键获取另一个值(值)。这不依赖于任何订单。
如果您想要订购密钥,请获取密钥并对其进行排序。
BTW:有序和有序之间存在差异。有序意味着元素保持它的位置。无论排序方式如何,此订单都可以是未排序的。
要显示差异,请考虑这样的字典创建:
var testDict: [String : Int] = [
"b" : 2,
"a" : 1,
"c" : 3,
"d" : 4
]
如果将订购字典,则代码的结果将为:b,a,c,d。这是创建字典的 order 。但它没有排序。 (排序如何?拼音?字面意思?字母数字?)
有序的数组(也就是保留元素的位置)也没有排序。将同质有序集合作为NSArray
保持顺序,即使无法对它们进行排序:想想包含字符串,数字和图像的数组。数组保持您放置项目的顺序。但它不知道对它进行排序。 (同样:无论排序是什么意思。)在Swift,Objective-C和Foundation的整个生物圈中,只有一个排序集合:NSIndexSet
。