我正在玩一些可能的方法从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]
答案 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])
。