我声明并初始化了一个[[String:[String:String]
字典。一开始它是空的,我正在尝试在父键下添加多个值。
var dictionary = [String:[String:String]
// some checks
dictionary[i] = ["name" : name]
dictionary[i] = ["from" : country]
dictionary[i] = ["age" : age]
当我这样做时,我最终只有年龄键作为 [key: [String:String]
岁以下的孩子。因此,当我使用这种方法时,它会覆盖。
什么是适当的做法
您的代码在每一行上创建一个新字典,并在键i
的dictionary
中分配此字典,因此您最终会得到最后一个字典["age" : age]
您需要创建一个内部字典,将值分配给 this,然后将其分配给外部字典;
var innerDict = [String:String]()
innerDict["name"] = name
innerDict["from"] = from
innerDict["age"] = age
dictionary[i] = innerDict
但是,我建议您考虑创建一个结构并将其放在外部字典中,而不是使用字典字典
func insert(key:String, value:String, at k:String) {
var d = dictionary[k] ?? [String:String]()
d[key] = value
dictionary[k] = d
}
以下是测试方法:
insert("name", value: name, at: i)
insert("from", value: country, at: i)
insert("age", value: age, at: i)
可以使用可选链接分配给内部字典,但需要先创建内部字典。
// create the dictionary of dictionaries
var dictionary = [String:[String:String]]()
// some example constants to make your code work
let i = "abc"
let name = "Fred"
let country = "USA"
let age = "28"
// Use nil coalescing operator ?? to create
// dictionary[i] if it doesn't already exist
dictionary[i] = dictionary[i] ?? [:]
// Use optional chaining to assign to inner dictionary
dictionary[i]?["name"] = name
dictionary[i]?["from"] = country
dictionary[i]?["age"] = age
print(dictionary)
输出:
["abc": ["age": "28", "from": "USA", "name": "Fred"]]
使用这些技术,这是我对@matt insert(_:value:at:)
函数的版本:
func insert(key:String, value:String, at k:String) {
dictionary[k] = dictionary[k] ?? [:]
dictionary[k]?[key] = value
}