如何指定Dictionary.Value必须是数组

时间:2015-02-06 23:28:14

标签: swift generics

看到问题"如何将项目附加到字典中的数组?"第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是一个数组类型,如果是,那该怎么办?

0 个答案:

没有答案