swift - 如何将 Swift 字典公开为键值对的类型化序列?

标签 swift generics dictionary

假设我有一个类:

class Foo<K, V> {
    var dict: [K:V] = [:]
}

我想让调用者遍历字典中的键值对,而不提供对字典本身的直接访问。所以调用者可以这样写:

val foo: Foo<Bar, Qux> = ...

for (b, q) in foo.asSequence() {
   ...
}

现在,由于 Dictionary 符合来自其他语言的 SequenceType,我希望只需按照以下行向 Foo 添加一个方法:

    func asSequence() -> SequenceType<K, V> {
        return dict
    }

但是,Swift 协议(protocol)不采用泛型参数,SequenceType 是那些“只能用作泛型约束,因为它具有 self 或关联类型要求”的恼人类型之一。

我可能会弄清楚如何将 dict 包装在符合 SequenceType 的内容中(或者使 Foo 本身符合 SequenceType ) 但我不想开始摆弄生成器和诸如此类的东西,除非我绝对必须这么做——如果我只是更好地理解可用选项,这似乎应该是一个单行代码。 (我不清楚这是否足以让泛型工作,这样 (b, q) 无论如何都有正确的类型。)

最佳答案

@MartinR 的解决方案很好,但我会更进一步——如果你有一个类型,并且你想给它一个方法asSequence,那么听起来你真的想要你的类型以符合 SequenceType 本身,这很容易做到:

extension Foo: SequenceType {
    func generate() -> GeneratorOf<(K, V)> {
        return GeneratorOf(dict.generate())
    }
}

当然,如果你的类实际上公开了多个东西,这就没有意义了,但如果这个特定的序列是它存在的基础,那么这可能是最好的选择。

关于swift - 如何将 Swift 字典公开为键值对的类型化序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28786859/

相关文章:

c# - T 类型的泛型,其中 T 具有特定属性

c# - 如何合并2本词典

c# - 使用反射获取字典值

ios - 更改 UIView 约束高度带来其 subview 的约束警告

ios - OAuth2、 swift 3、Instagram

ios - 在继续执行代码之前,如何检查 UIAlertController 是否已被解除?

swift - 无法识别的选择器发送到实例

java - 我们可以通过调用 class#newInstance() 创建类型化类的实例吗

快速错误 "[T] is not a subtype of"

python - 使用 Python 合并两个 CSV 文件