Swift中的字典[String:[String]]

时间:2017-06-17 20:41:07

标签: arrays swift dictionary value-type

我的字典看起来像这样:

dict["hello"] = ["item 1"]

我希望能够为单个密钥添加多个数组。这很好用:

dict["hello"] = ["item 2"] // overwrites item 1 – how to avoid overwriting?

但是当我分配一个新数组时,前一个值显然会被覆盖 - 我们要避免这样做:

append

所以我尝试使用dict["hello"]?.append("test") // does nothing? output: () 方法,但这会返回nil:

npm install

如何将字符串附加到Swift中某个键的数组(值)?

4 个答案:

答案 0 :(得分:6)

首先......

......你真的不想要这个

  

我希望能够为单个密钥添加多个数组。

相反,我认为你想......

  

...将字符串添加到与给定字符串相关联的数组

实施例

换句话说,你想要从这个

开始
["hello":["item 1"]]

到这个

["hello":["item 1", "item 2"]]]

那么,怎么做呢?

让我们从您的词典开始

var dict = [String: [String]]()
dict["hello"] = ["item 1"]

现在您需要提取与hello

关联的数组
var list = dict["hello"] ?? []

向其添加字符串

list.append("item 2")

最后将更新的数组添加回字典

dict["hello"] = list

就是这样

答案 1 :(得分:4)

这是您的代码所做的

dict["hello"] = ["item 1"] - 这会将hello设置为["item 1"]

dict["hello"] = ["item 2"] - 这会将hello设置为["item 2"]

这就像一个变量,例如:

var hello = Array<String>()

hello = ["item 1"] // prints out ["item 1"]

hello = ["item 2"] // prints out ["item 2"]

这就是你的字典发生的事情。您使用新数据覆盖任何存储的数据。

附加问题。这仅在该键已存在数组时才有效。

dict["hello"]?.append("test")这不会起作用。

但这会。

dict["hello"] = ["test 1"]

dict["hello"]?.append("test")

print(dict) // prints out ["dict":["test 1","test"]]

您需要做什么

var dict = Dictionary<String,Array<String>>()

func add(string:String,key:String) {

    if var value = dict[key] {

        // if an array exist, append to it

        value.append(string)

        dict[key] = value

    } else {

        // create a new array since there is nothing here

        dict[key] = [string]
    }
}

add(string: "test1", key: "hello")

add(string: "test2", key: "hello")

add(string: "test3", key: "hello")

print(dict) // ["hello": ["test1", "test2", "test3"]]

字典扩展

extension Dictionary where Key == String, Value == Array<String> {

    mutating func append(_ string:String, key:String) {

        if var value = self[key] {

            // if an array exist, append to it

            value.append(string)

            self[key] = value

        } else {

            // create a new array since there is nothing here

            self[key] = [string]
        }
    }
}

如何使用

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    var dict = Dictionary<String,Array<String>>()

    dict.append("first", key: "hello")

    dict.append("second", key: "hello")

    dict.append("thrid", key: "hello")

    dict.append("one", key: "goodbye")

    dict.append("two", key: "goodbye")

    print(dict) // ["hello": ["first", "second", "thrid"], "goodbye": ["one", "two"]]
}

答案 2 :(得分:1)

请尝试这件事,让我知道这是否是你需要的

    import UIKit

    var dict = [String: [String]]()
if var value = dict["hello"]{
    value.append("Hi")
    dict["hello"] = value
}else{
    dict["hello"] = ["item 1"]
}

答案 3 :(得分:1)

其他人有正确的解决方案。以下是相同答案的快速简写。

var dict = [String: [String]]()

dict["hello"] = (dict["hello"] ?? []) + ["item 1"]
dict["hello"] = (dict["hello"] ?? []) + ["item 2"]

在Swift 4中,这将是

var dict = [String: [String]]()

dict["hello"] = dict["hello", default: []] + ["item 1"]
dict["hello"] = dict["hello", default: []] + ["item 2"]