如何附加到作为 Swift 字典中的值的数组

How to append to an array that is a value in a Swift dictionary

假设我有一个接受字符串作为键和数组作为值的字典:

var d = [String: [Int]]()
d["k"] = [Int]()

现在我想append()["k"]下的数组。我该怎么做?

[Int](d["k"]).append(1) // error
(d["k"] as [Int]).append(1) // error

我想这是非常基本的东西,但我无法理解...非常感谢!

因为Dictionary和Array都是struct类型,所以不能原地修改Array,只能提取还原:

if var items = d["k"] {
    items.append(1)
    d["k"] = items
}
else {
    d["k"] = [1]
}

像这样:

var d = [String: [Int]]()
d["k"] = [Int]()
if var items = d["k"] {
    items.append(1)
    d["k"] = items
}

你必须:

  1. 拉出来
  2. 展开可选的
  3. 将其分配给 var 引用
  4. 追加,
  5. 再放回去

if var 行将前三个步骤合而为一。

如果该键的元素存在,您只需执行以下操作:

d["k"]?.append(1)

请注意,如果 "k" 键不存在任何元素,则什么也不会发生。如果您想确保该键实际上有一个数组,只需在附加之前添加:

if d["k"] == nil {
    d["k"] = []
}

所有其他答案都是正确的,但是如果您觉得检查很烦人 nil,请展开...

我做了一个自定义运算符。

有了这个,你可以无条件扩展Optional数组

infix operator +=! {
    associativity right
    precedence 90
    assignment
}

func +=!<T, S:SequenceType where S.Generator.Element == T>(inout lhs:[T]?, rhs:S) {
    if lhs == nil {
        // the target is `nil`, create a new array
        lhs = Array(rhs)
    }
    else {
        // the target is not `nil`, just expand it
        lhs! += rhs
    }
}

用法:

var d = [String: [Int]]()

// ... d["test"] may or may not exists ...

d["test"] +=! [1]