假设我有一个值数组的键映射,并希望为其中一个数组添加一个值:
func addVal<K:Hashable, V>(map: inout [K: [V]], new: (key: K, val: V)) {
if var list = map[new.key] {
list.append(new.val)
} else {
map[new.key] = [new.val]
}
}
此代码不起作用:由于数组具有值语义,list
是map[new.key]
的副本,新值永远不会插入到存储的数组中。
对此有一种不错的惯用方法吗?
我知道这很有效:
func addVal<K:Hashable, V>(map: inout [K: [V]], new: (key: K, val: V)) {
if map[new.key] != nil {
map[new.key].append(new.val)
} else {
map[new.key] = [new.val]
}
}
我认为这是一个不太好的解决方法;我宁愿处理选项而不明确检查nil
。
答案 0 :(得分:1)
这是安全的,不会弄乱nil
,并避免不必要地复制被操纵的数组:
func addVal<K:Hashable, V>(map: inout [K: [V]], new: (key: K, val: V)) {
if let _ = map[new.key] {
map[new.key]!.append(new.val)
} else {
map[new.key] = [new.val]
}
}