如何将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())
}
}