【问题标题】:Extracting values of multiple keys at once from a Swift dictionary从 Swift 字典中一次提取多个键的值
【发布时间】:2014-09-23 01:46:50
【问题描述】:

我正在尝试一些可能的方法来一次从 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]

【问题讨论】:

    标签: dictionary swift generics


    【解决方案1】:

    我不完全确定为什么 for seqElt in seq 不起作用(我怀疑是一个错误),但在 for-in 中使用 SequenceOf&lt;Key&gt;(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])

    【讨论】:

    • 谢谢。有趣的是,没有显式类型的 SequenceOf(seq) 也不起作用。 (错误消息同样晦涩难懂:Cannot invoke 'init' with an argument of type 'S'。)实际上,查看 Swift 标头,SequenceOfinit(sequence) 方法对传入的序列类型没有任何要求 - 撒谎似乎完全没问题序列类型,例如SequenceOf&lt;String&gt;(seq) 在这个例子中。然后seqElt 的类型为Stringself[seqElt] 无效,但for 循环似乎没问题。
    猜你喜欢
    • 2021-09-17
    • 2023-03-14
    • 1970-01-01
    • 2017-08-08
    • 2021-09-03
    • 2019-10-04
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多