假设我有一门课是这样的:

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/

10-13 03:36