我是Swift的新手,目前正在练习一些基本的东西,当我试图弄清楚为什么没有订购字典内容时,我找到了某个人的帖子的答案,解决方案之前添加一个索引它,像这样:
[Int [String,String]]
当我尝试测试时,出现了关于
的错误expression type '[Dictionary<Int, Dictionary<String, Int>>]' is ambiguous without more context
不知道出了什么问题,所以我只是展示代码并寻求帮助。
var animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]]
for (key, (animal, num)) in animalNumbers {
print ("\(animal) = \(num)")
}
答案 0 :(得分:2)
我怀疑你可能误解了有关数字键的建议。
首先,让我们退后一步。我假设您的原始字典如下,并且您试图解决订单未被保留的问题:
let animals = ["Cat": 1, "Dog": 10, "Aye-Aye": 98]
我怀疑你读到了其他答案并得出结论,你需要将其转换为:
let animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]]
这是一个嵌套字典数组,每个字典都有一个数字键。但这没有意义。你解决了这个问题两次。它是一个有序的字典数组,然后数字键还提供了一种以某种特定顺序检索值的机制。这是多余的。
数字键的想法是使它成为一个字典,其键是一个数值,其值本身就是字典。如果你这样做,它比你在那里更简单,而只是:
let animalNumbers = [0: ["Cat": 1], 1: ["Dog": 10], 2: ["Aye-Aye": 98]]
注意,这是一个带有数字键[Int: [String: Int]]
的字典。无论如何,一旦你有了这本词典,理论上就可以做到:
for i in 0 ..< animalNumbers.count {
for (name, value) in animalNumbers[i]! {
print(name, value)
}
}
但是,如果反向设计我怀疑其他答案的建议,我应该说它真的不是一个非常好的模式。如果要插入值,则必须经历重建所有这些数字键的噩梦。
相反,只需使用一个简单的字典数组[[String: Int]]
,这是有序的,但消除了手动构造的数字键引入的许多问题:
let animals = [["Cat": 1], ["Dog": 10], ["Aye-Aye": 98]]
然后你可以:
for dictionary in animals {
for (name, value) in dictionary {
print(name, value)
}
}
最后,更好的是,你不应该处理字典数组,而是处理一系列自定义类型:
struct Animal {
let name: String
let value: Int
}
let animals = [
Animal(name: "Cat", value: 1),
Animal(name: "Dog", value: 10),
Animal(name: "Aye-Aye", value: 98)
]
现在您正在处理[Animal]
类型,您可以:
for animal in animals {
print(animal.name, animal.value)
}
答案 1 :(得分:0)
这样做 -
var animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]]
for animal in animalNumbers {
for (animalName, num) in animal
{
print ("\(animalName) = \(num)")
}
}
答案 2 :(得分:0)
有两个问题:
for
循环中枚举嵌套对象。解决方案是使用第二个for循环
let animalNumbers = [[1: ["Cat": 1]], [2: ["Dog": 10]], [3: ["Aye-Aye": 98]]]
for animal in animalNumbers {
for (key, value) in animal {
print ("\(key) = \(value)")
}
}
关于为什么词典内容没有被排序那是如何定义词典的:
字典存储相同类型的键与集合中没有定义排序的相同类型值之间的关联。