看到问题"如何将项目附加到字典中的数组?"第n次,我决定写一个扩展来简化整个事情。
我从一个全局函数开始,但它有明显的问题,它没有作用域,并要求明确地通过引用传递字典:
func appendValue<K, V>(value:V, forKey key:K, inout inDict dictionary:[K:[V]]) {
if var items = dictionary[key] {
items.append(value)
dictionary[key] = items
}
else {
dictionary[key] = [value]
}
}
var d = [String:[Int]]()
appendValue(1, forKey: "k", inDict: &d)
它有效,但它有点笨重。我更愿意只使用d.appendValue(1, forKey:"k")
,所以我试着把它放在字典的扩展名中:
extension Dictionary {
mutating func appendValue<V where Value == [V]>(value:V, forKey key:Key) {
if var items = self[key] {
items.append(value)
self[key] = items
}
else {
self[key] = [value]
}
}
}
现在where子句似乎编译好了,但它没有达到预期的效果。我希望它需要Dictionary.Value是一些数组类型,但我在items.append和赋值语句中得到错误,表明事实并非如此,事实上,这个块:
var d2 = [String:Int]()
d2.appendValue(1, forKey: "k")
不会产生d2.Value
不是数组的预期错误。
认为问题也可能是使用简写符号,我尝试将[V]
更改为Array<V>
,但这似乎没有帮助,尽管它确实给出了错误的地方条款same-type requirement makes generic parameter 'Value' non-generic
所以问题是,我可以在Dictionary
上编写一个扩展方法,要求Dictionary.Value
是一个数组类型,如果是,那该怎么办?