dictionary - 从 Swift 字典中一次提取多个键的值

标签 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]

最佳答案

我不完全确定为什么 for seqElt in seq不起作用(我怀疑是错误),但使用 SequenceOf<Key>(seq)在 for-in 工程中:

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])相反。

关于dictionary - 从 Swift 字典中一次提取多个键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25985641/

相关文章:

c++11 - 如何在 C++ 中将 insert 插入到 <string, vector<pair::<string, string>>> 的映射中?

ios - 比较字符串忽略开头或结尾的空格

python - 垂直打印列表字典

python - 使用条件从列表填充字典

Python添加列表作为字典中的键

ios - 为什么在相似的代码片段中初始化的顺序不同。 swift 4

swift - Firebase 身份验证 : Password must contain capital letter

java - 关于 Java 泛型下限用法 : ? super T

generics - 使用带有泛型的 Dart 的 call() 方法

.net - 圆形类型约束