为什么SequenceType.dropFirst(_ :)返回Self.SubSequence而不是Self?

时间:2016-08-19 14:32:26

标签: swift

试图理解SequenceType protocol

protocol SequenceType {
    associatedtype SubSequence
    @warn_unused_result func dropFirst(_ n: Int) -> Self.SubSequence
    /* ... */
}

为什么我们需要associatedtype SubSequence,为什么不需要SelfSequenceType

1 个答案:

答案 0 :(得分:4)

这样做是为了提高灵活性。允许符合SequenceType协议的类定义不同的类来表示其子序列,这样实现者就可以构造轻量级类,在不进行复制的情况下将视图呈现为原始序列,同时保留重用的能力与Subsequence相同的序列类型。

考虑一个树集集合的实现,它保持元素的排序。 dropFirst的实现可以选择返回"子树"链接到原始树但具有不同起始节点的集合。这种子树的实现可能非常轻量级 - 无论树的大小如何,都需要相同的空间量,即O(1)。相反,将实现者绑定到同一个树类会强制它们制作子树的副本,即O(n)。