2016-08-19 5 views
3

SequenceType protocolを理解しようとすると:なぜSequenceType.dropFirst(_ :)はSelfの代わりにSelf.SubSequenceを返しますか?

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

私たちが今までassociatedtype SubSequence、なぜSelfSequenceTypeを必要とするのはなぜ?

+2

たとえば、 'someArray.dropFirst()'は 'Array'ではなく' ArraySlice'を返します。 –

+0

@MartinRありがとう、今私は私の心の中でこの接続を持っています –

答えて

4

これは柔軟性を高めるためです。 SequenceTypeプロトコルに準拠したクラスに異なるクラスを定義してそのサブシーケンスを表すことを許可すると、コピーを作成することなく元のシーケンスにビューを提示する軽量クラスを構築することができ、Subsequenceと同じシーケンスタイプを再利用することができます。

要素をソートしたままにしておくツリー集合コレクションの実装を考えてみましょう。 dropFirstの実装では、元のツリーにリンクされているが開始ノードが異なる「サブツリー」コレクションを返すオプションがあります。このようなサブツリーの実装は、非常に軽量である可能性があります。ツリーのサイズ(O(1))に関係なく同じ量のスペースが必要です。対照的に、実装者を同じツリークラスにバインドすると、O(n)というサブツリーのコピーが作成されます。

+0

短くて完璧な説明、ありがとう! –

+1

そして、場合によっては、それらのO(n)実装も可能ではないかもしれません。 「シーケンス」がメタデータを含む場合を考える。たとえば、開かれたファイルの名前や開かれた日などの「ファイルハンドル」シーケンスを作成することがあります。第1のもののサブシーケンスである別の 'Filehandle'を生成することはできないかもしれません(そして、一般的な方法で行うことは間違いありません)。 –

関連する問題