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

如何将Swift字典公开为键入的键值对序列?,swift,generics,dictionary,Swift,Generics,Dictionary,假设我有一个大致如下的课程: class Foo<K, V> { var dict: [K:V] = [:] } func asSequence() -> SequenceType<K, V> { return dict } 然而,Swift协议不采用通用参数,SequenceType是一种恼人的类型,它“只能用作通用约束,因为它具有自身或关联的类型要求” 我可能知道如何将dict包装成符合SequenceType的东西(

假设我有一个大致如下的课程:

class Foo<K, V> {
    var dict: [K:V] = [:]
}
    func asSequence() -> SequenceType<K, V> {
        return dict
    }
然而,Swift协议不采用通用参数,
SequenceType
是一种恼人的类型,它“只能用作通用约束,因为它具有自身或关联的类型要求”


我可能知道如何将
dict
包装成符合
SequenceType
的东西(或者使
Foo
本身符合
SequenceType
)但我不想开始摆弄发电机之类的东西,除非我绝对必须这么做——如果我只是更好地理解可用的选项,这似乎应该是一条单行线。(我不清楚这是否足以让泛型工作,从而使
(b,q)
具有正确的类型。)

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

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

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

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

extension Foo: SequenceType {
    func generate() -> GeneratorOf<(K, V)> {
        return GeneratorOf(dict.generate())
    }
}
扩展Foo:SequenceType{ func generate()->GeneratorOf{ 返回GeneratorOf(dict.generate()) } } 当然,如果您的类实际公开了多个内容,那么这是没有意义的,但是如果这个特定的序列是其存在的基础,那么这可能是最好的选择

/// A type-erased sequence.
/// 
/// Forwards operations to an arbitrary underlying sequence with the
/// same `Element` type, hiding the specifics of the underlying
/// sequence type.
extension Foo: SequenceType {
    func generate() -> GeneratorOf<(K, V)> {
        return GeneratorOf(dict.generate())
    }
}