我有一本字典 - > var dictionary = [String : [String]]()
我希望在字典数组中追加字符串值。这就是我在做的事情
for (key, value) in dictionary {
dictionary.updateValue(value.append(nameText),forKey: "name")
}
在这里,nameText
是一个字符串,我收到一个错误,
不能对不可变值使用变异成员:'value'是'let'常量。
我做错了什么?非常感谢帮助。
答案 0 :(得分:1)
您的第一个问题是value
是循环体内的let
常量。您必须将其声明为var
才能改变它。
您的第二个问题是,您尝试使用value.append(nameText)
作为设置密钥的值。但是,append()
会使数组发生变异,并返回Void
。
第三,不要使用updateValue(forKey:)
。真的没有意义。请改用下标。
var dictionary = [
"a" : ["a"],
"b" : ["b", "b"],
"c" : ["c", "c", "c"],
]
let nameText = "foo"
for (key, var value) in dictionary {
value.append(nameText)
dictionary["name"] = value
}
现在,这会让您的代码编译,但我非常怀疑这是您想要做的事情。您将在每次迭代时覆盖"name"
键的值,这意味着只有最后一次迭代的值将保持不变。此外,由于Dictionary
没有定义的排序,因此此代码具有不确定的行为。你究竟想做什么?
答案 1 :(得分:0)
试试这个:
var links=[];
d3.csv("C:\Users\user\Desktop\tv.csv", function(data){
links=data;
doThisWithData(links);
});
答案 2 :(得分:0)
想一想; value.append(nameText)
是操作。它返回Void
(类型为......什么都没有!)。
您希望将值更新为已执行操作的 。
而不是手动制作临时副本,修改它,然后使用它来更新某些键的值,您只需使用下标和扩展名:
你想要的是:
extension Dictionary
{
public subscript(forceUnwrapping key: Key) -> Value
{
get
{
return self[key]!
}
set
{
self[key] = newValue
}
}
}
因此,对于名为dictionary
的词典:
for key in dictionary.keys
{
dictionary[forceUnwrapping: key].append(nameText)
}
具体而言,dictionary[forceUnwrapping: key].append(nameText)
。
答案 3 :(得分:0)
/* example setup */
var dictionary: [String: [String]] = ["foo": [], "bar": []]
let nameText = "foobar"
/* append the value of the 'nameText' immutable to each inner array */
dictionary.keys.forEach { dictionary[$0]?.append(nameText) }
/* ok! */
print(dictionary) // ["bar": ["foobar"], "foo": ["foobar"]]
如以下Q& A所述
...,最好注意变异"到位"的开销,特别是如果工作性能紧张的应用程序。从上面的链接线程中的答案中得到建议,可以采用另一种更明智,更少复制浪费的方法:
var dictionary: [String: [String]] = ["foo": [], "bar": []]
let nameText = "foobar"
dictionary.keys.forEach {
var arr = dictionary.removeValue(forKey: $0) ?? []
arr.append(nameText)
dictionary[$0] = arr
}
print(dictionary) // ["bar": ["foobar"], "foo": ["foobar"]]