2016-08-19 3 views
3

SequenceType protocol을 이해하려고 노력 :SequenceType.dropFirst (_ :)가 Self 대신 Self.SubSequence를 반환하는 이유

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

을 우리가 이제까지 associatedtype SubSequence 필요한 이유, 왜 안 Self, SequenceType?

+2

예를 들어'someArray.dropFirst()'는'Array'가 아닌'ArraySlice'를 반환합니다. –

+0

@ MartinR 고마워, 이제 내 마음 속에이 연결이있어. –

답변

4

유연성 향상을 위해 수행되었습니다. SequenceType 프로토콜을 따르는 클래스가 서브 클래스를 표현하기 위해 다른 클래스를 정의하도록 허용하면 구현자는 복사본을 만들지 않고 뷰를 원래 시퀀스로 표시하면서 동일한 시퀀스 유형을 Subsequence과 같이 재사용하는 기능을 유지하면서 가벼운 클래스를 구성 할 수 있습니다.

요소를 정렬 된 상태로 유지하는 트리 집합 컬렉션의 구현을 고려하십시오. dropFirst의 구현에는 원본 트리에 연결되어 있지만 시작 노드가 다른 "하위 트리"컬렉션을 반환하는 옵션이 있습니다. 그러한 하위 트리의 구현은 매우 가볍습니다. 트리의 크기 (O (1))에 관계없이 동일한 양의 공간이 필요합니다. 대조적으로 구현자를 동일한 트리 클래스에 바인딩하면 O (n) 인 하위 트리의 복사본을 만들어야합니다.

+0

짧고 완벽한 설명, 고마워! –

+1

그리고 어떤 경우에는 O (n) 구현이 불가능할 수도 있습니다. 'Sequence'가 메타 데이터를 포함하는 경우를 고려하십시오. 예를 들어, 열어 본 파일의 이름과 파일을 열 때의 날짜와 같은 것을 포함하는'Filehandle' 시퀀스를 만들 수 있습니다. 주먹의 서브 시퀀스 인 또 다른'Filehandle '을 생성하는 것이 가능하지 않을 수도 있습니다 (그리고 일반적인 방법으로는 불가능합니다). –

관련 문제