如何附加到作为 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
}
你必须:
- 拉出来
- 展开可选的
- 将其分配给
var
引用
- 追加,
- 再放回去
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]
假设我有一个接受字符串作为键和数组作为值的字典:
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
}
你必须:
- 拉出来
- 展开可选的
- 将其分配给
var
引用 - 追加,
- 再放回去
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]