无法将值添加到字典中

时间:2016-12-15 14:57:18

标签: arrays swift dictionary

我有一本字典 - > var dictionary = [String : [String]]()我希望在字典数组中追加字符串值。这就是我在做的事情

 for (key, value) in dictionary {
  dictionary.updateValue(value.append(nameText),forKey: "name")
}

在这里,nameText是一个字符串,我收到一个错误,

  

不能对不可变值使用变异成员:'value'是'let'常量。

我做错了什么?非常感谢帮助。

4 个答案:

答案 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"]]