[英]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.