对于以下变量
var dict2 = ["key1" : "value1", "key2" : [ "value1" , "value2" ]]
如何为以下字典的第二个键添加第三个值?
答案 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>
在下一行中,我们向数组添加一个新元素 - 请注意,如果array
为nil
,则可选链接表达式的计算结果为nil
,并且没有任何反应
在最后一行中,我们将新的array
值设置回相应的键 - 这一步是必需的,因为数组是一个值类型,所以当我们从字典中提取它时,我们实际得到一个副本它 - 所以对它进行的任何更新都不会应用于原始数组。