티스토리 뷰

Swift&IOS

Sequence

밀쿄 2019. 12. 17. 11:18

오늘은 스위프트의 프토토콜 중 하나인 Sequence에 대해서 알아보겠습니다.
Sequence는 꽤 중요한 프로토콜이라고 생각합니다.
Array 타입을 사용할 때 대부분의 기능을 이 프로토콜이 제공할 뿐만 아니라
map, filter같은 것도 이 프로토콜에 정의 되어 있습니다.

애플문서는에는 다음과 같이 언급되어 있습니다
"요소에 순차적으로 반복 접근 할 수 있는 타입"

조금 더 살펴보자면
시퀀스는 한 번에 하나씩 단계별로 수행할 수 있는 값 리스트이고
시퀀스 요소로를 반복하는 가장 일반적인 방법은 for-in 이라고 합니다.

그리고 그렇게 for-in을 사용하면 시퀀스에 특정 값이 포함되어 있는지 확인할 수도 있죠.
또한 시퀀스의 끝에 도달할 때까지 각 요소를 테스트할 수 있죠

그리고 사용자가 커스텀 시퀀스를 만들려고 하면 두 가지 경우가 있습니다.
첫째 makeIterator 메서드를 구현하거나,
둘째 유형 그 자체가 Iterator로 작동할 수 있으면
Sequence, IteratorProtocol를 채택하고 그 요구 사항을 구현하는것으로 만들 수 있습니다.
왜냐하면 그 두 프로토콜을 채택하면 makeIterator함수가 기본적으로 제공되기 때문입니다.

조금 Deep하게 보자면 애플의 Sequence 구현체의 일부를 조금만 살펴보면 (여기서 볼 수 있습니다)

다음과 같이 구현 되어있습니다.

public protocol Sequence {
    associatedtype Element where Self.Element == Self.Iterator.Element
    associatedtype Iterator : IteratorProtocol
    func makeIterator() -> Self.Iterator

Elemnet 와 Iterator 두 개와 Iterator를 만드는 makeIterator함수로 구현되어 있는 것을 볼 수 있습니다.'

이 쯤되니 IteratorProtocol이 뭐하는 프로토콜인지 궁금해지네요.

한 번 살펴보도록하겠습니다.

이 프로토콜의 애플 문서를 살펴보면 한 번에 하나씩 시퀀스 값을 제공하는 타입입니다.
아직 감이 안오니 계속 보도록 하겠습니다.
아까까지 우리가 살펴본 Sequence프로토콜이랑 밀접한 관련이 있다고 하네요.
Sequence가 아까 구현부에서 봤듯이 Iterator를 생성하고 요소에 대한 엑세스를 제공했다면
이 프로토콜은 반복 과정을 추적하고 시퀀스를 진행하면서 한 번에 하나의 요소씩 반환한다고 합니다.
그러므로 Sequence의 반복자를 직접 사용하면 for-in을 돌리는 것과 같은 효과를 볼 수 있다고 하네요.

자 이 쯤 읽었으니 IteratorProtocol도 내부가 어떻게 생겼는 지 한 번 보도록하겠습니다 (아까 시퀀스 문서에 있습니다)

public protocol IteratorProtocol {
  associatedtype Element
  mutating func next() -> Element?
}

이렇게 구현되어 있습니다.

Iterator가 반환하는 Element랑 다음 요소를 반환하는 next() 함수도 되어있습니다.

또한 next함수는 리턴값이 옵셔널이기때문에 저 함수가 nil을 리턴하면 마지막인 것으로 체크하게 됩니다

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함