protocol SequenceType {
associatedtype SubSequence
@warn_unused_result func dropFirst(_ n: Int) -> Self.SubSequence
/* ... */
}
为什么我们需要associatedtype SubSequence
,为什么不需要Self
,SequenceType
?
答案 0 :(得分:4)
这样做是为了提高灵活性。允许符合SequenceType
协议的类定义不同的类来表示其子序列,这样实现者就可以构造轻量级类,在不进行复制的情况下将视图呈现为原始序列,同时保留重用的能力与Subsequence
相同的序列类型。
考虑一个树集集合的实现,它保持元素的排序。 dropFirst
的实现可以选择返回"子树"链接到原始树但具有不同起始节点的集合。这种子树的实现可能非常轻量级 - 无论树的大小如何,都需要相同的空间量,即O(1)。相反,将实现者绑定到同一个树类会强制它们制作子树的副本,即O(n)。