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

Sha*_* Of 3 swift

试图理解SequenceType协议

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

为什么我们需要associatedtype SubSequence,为什么Self不需要SequenceType

das*_*ght 5

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

考虑一个保持其元素排序的树集集合的实现。的实现dropFirst可以选择返回链接到原始树的“子树”集合,但具有不同的起始节点。这种子树的实现可能非常轻量级 - 无论树的大小如何,您都需要相同数量的空间,即 O(1)。相反,将实现者绑定到同一个树类将迫使他们复制子树,其时间复杂度为 O(n)。