如何为字典上的键添加额外值?

时间:2015-06-26 20:47:12

标签: swift dictionary

对于以下变量

var dict2 = ["key1" : "value1", "key2" : [ "value1" , "value2" ]]

如何为以下字典的第二个键添加第三个值?

2 个答案:

答案 0 :(得分:4)

如果我可以稍微重新制定您的private int fact(int n){ int nf = 1; for (int i = 1; i < n; ++i) { nf *= i; } return nf; } 声明:

dict2

然后您可以将额外的项目添加到var dict2 = ["key1" : ["value1"], "key2" : [ "value1" , "value2" ]] ,如下所示:

key2

但是,您可能需要小心检查dict2["key2"]?.append("value3") 是否已存在。否则,上述声明将无效。在这种情况下,你可以写:

key2

为什么我要更改原始声明?根据我提供的版本,if dict2["key2"]?.append("value3") == nil { dict2["key2"] = ["value3"] } 的类型为dict2。但是对于你的版本,Swift正在做的是声明一个更松散的类型[String:[String]]。这会编译,但行为非常不同(内容将具有引用而非值语义,您将不得不进行类型检查和频繁转换等),并且最好避免使用。

答案 1 :(得分:2)

@AirspeedVelocity提供了一个可行的解决方案,但需要对数据的定义方式稍作改动 - 但如果可能的话,这就是我自己做的。

但是,如果您必须坚持使用原始数据格式,则可以使用以下代码:

var dict2: [String : AnyObject] = ["key1" : "value1", "key2" : [ "value1" , "value2" ]]

var array = dict2["key2"] as? [String]
array?.append("value3")
dict2["key2"] = array

首先,我们明确指出dict2类型,一个使用字符串作为键的字典,并使用AnyObject作为值。

接下来,我们提取key2键的值,并尝试强制转换为字符串数组 - 请注意,这会返回一个可选项,因此array的类型为[String]? < / p>

在下一行中,我们向数组添加一个新元素 - 请注意,如果arraynil,则可选链接表达式的计算结果为nil,并且没有任何反应

在最后一行中,我们将新的array值设置回相应的键 - 这一步是必需的,因为数组是一个值类型,所以当我们从字典中提取它时,我们实际得到一个副本它 - 所以对它进行的任何更新都不会应用于原始数组。