我想知道以下是否可以写得更短
var t = [String:[Int]]()
if t["a"] == nil { t["a"] = [1] }
else { t["a"]!.append(2) }
如果哈希值不存在则指定哈希值并重新使用它。
我知道我可以写一个像
这样的函数func extend(inout t:[String:[Int]], key:String, n:Int) {
if t[key] == nil { t[key] = [n] }
else { t[key]!.append(n) }
}
但是想知道是否有更优雅的方式。
编辑实际上我正在寻找该功能的快捷方式,但复制/粘贴上面有不同初始值/添加值的测试代码。
答案 0 :(得分:4)
如果您尝试在数组存在时附加1
,并在数组不存在时创建[1]
(如extend
函数所暗示的那样),则可以使用 nil coalescing operator ??
,如下所示:
t["a"] = (t["a"] ?? []) + [1]
扩展示例:
var t = [String:[Int]]()
t["a"] = (t["a"] ?? []) + [1] // t = ["a":[1]]
t["a"] = (t["a"] ?? []) + [2] // t = ["a":[1,2]]
t["b"] = (t["b"] ?? []) + [4] // t = ["b":[4], "a":[1,2]]
答案 1 :(得分:2)
如果是,您可以使用可选链接返回nil
的事实
方法可以不被调用:
if (t["a"]?.append(2)) == nil {
t["a"] = [1]
}
作为通用函数实现(在可选项上运行) 字典值,而不是整个字典):
var t = [String:[Int]]()
func setOrAppend<T>(inout array : [T]?, initialValue : T, newValue : T) {
if (array?.append(newValue)) == nil {
array = [initialValue]
}
}
println(t) // [:]
setOrAppend(&t["a"], 1, 2)
println(t) // [a: [1]]
setOrAppend(&t["a"], 1, 2)
println(t) // [a: [1, 2]]