从Swift词典中一次提取多个键的值

时间:2014-09-23 01:46:50

标签: dictionary swift generics

我正在玩一些可能的方法从Swift词典中一次提取多个值。目标是做这样的事情:

var dict = [1: "one", 2: "two", 3: "three"]
dict.multiSubscript(2...4) // Should yield ["two", "three", nil]

或者这个:

dict.multiSubscript([1, 2]) // Should yield ["one", "two"]

换句话说,似乎应该可以为任何符合SequenceType的下标类型实现multiSubscript()

但是,Swift似乎不喜欢以下实现,并且错误消息不是很有启发性:

extension Dictionary {
    func multiSubscript<S: SequenceType where S.Generator.Element == Key>(seq: S) -> [Value?] {
        var result = [Value?]()
        for seqElt in seq { // ERROR: Cannot convert the expression's type 'S' to type 'S'
            result += self[seqElt]
        }
        return result
    }
}

这似乎是对泛型的约束的相对直接的使用。有谁看到我做错了什么?

对于奖励积分,有没有办法实现这一点,以允许使用正常的下标语法?例如:

dict[2...4] // Should yield ["two", "three", nil]

1 个答案:

答案 0 :(得分:1)

我不完全确定为什么for seqElt in seq无效(我怀疑有错误),但在for-in中使用SequenceOf<Key>(seq)

func multiSubscript<S: SequenceType where S.Generator.Element == Key>(seq: S) -> [Value?] {
    var result = [Value?]()
    for seqElt in SequenceOf<Key>(seq) {
        result.append(self[seqElt])
    }
    return result
}

另请注意,result += self[seqElt]无法正常工作;我改为使用result.append(self[seqElt])