繁体   English   中英

如何将Swift Dictionary公开为键值对的键入序列?

[英]How do I expose a Swift Dictionary as a typed sequence of key-value pairs?

说我有一个类:

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协议不采用泛型参数,而SequenceType是那些令人讨厌的类型之一,“只能用作通用约束,因为它具有Self或相关类型要求”。

我可能想出如何将dict包装在符合SequenceType东西中(或使Foo本身符合SequenceType )但我不想开始乱搞生成器等等,直到我绝对不得不 - 这似乎应该是如果我更好地理解可用选项,那就是单线程。 (并且我不清楚这是否足以使泛型工作,使得(b, q)具有正确的类型,无论如何。)

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

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

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

可能有人提出了一个更优雅的解决方案,但这有效:

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

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

...我可能想出如何在符合SequenceType的东西中包装dict ...

这正是SequenceOf<>为您所做的。 从其API文档:

/// A type-erased sequence.
/// 
/// Forwards operations to an arbitrary underlying sequence with the
/// same `Element` type, hiding the specifics of the underlying
/// sequence type.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM