在多维字典中添加'Key:Value'是覆盖



我声明并初始化了一个[[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] 岁以下的孩子。因此,当我使用这种方法时,它会覆盖。

什么是适当的做法

您的代码在每一行上创建一个新字典,并在键idictionary中分配此字典,因此您最终会得到最后一个字典["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
}

最新更新