修改哈希的快捷方式

时间:2015-04-13 13:41:04

标签: swift hash

我想知道以下是否可以写得更短

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) }
}

但是想知道是否有更优雅的方式。

编辑实际上我正在寻找该功能的快捷方式,但复制/粘贴上面有不同初始值/添加值的测试代码。

2 个答案:

答案 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]]