假设我有一门课是这样的:
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
是那些恼人的类型之一,“只能用作泛型约束,因为它有自己或关联的类型需求”。我可能会想办法把
dict
包装成符合SequenceType
的东西(或者使Foo
本身符合SequenceType
),但我不想在绝对必须的情况下开始乱搞发电机之类的东西——如果我只是更好地理解可用的选项,这看起来应该是一行代码。(我也不清楚这是否足以让泛型工作,从而使(b, q)
拥有正确的类型。) 最佳答案
可能有人想出了一个更优雅的解决方案,但这是可行的:
class Foo<K : Hashable, V> {
var dict: [K:V] = [:]
func asSequence() -> SequenceOf<(K, V)> {
return SequenceOf(dict)
}
}
…我可能想办法把dict包装成符合sequencetype的东西…
这正是
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.
关于swift - 如何将Swift字典公开为键值对的类型化序列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28786859/