일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 멋사
- composable architecture
- widget
- 스위프트
- 운영체제
- c++
- 컴퓨터그래픽스
- 백준
- 후기
- 영남대
- Swift
- 위젯킷
- 네트워크
- cs
- 스유
- 리액트
- widgetkit
- spritekit
- TCA
- swift concurrency
- ReactorKit
- Protocol
- 대외활동
- 멋쟁이사자처럼
- 웹
- SwiftUI
- dispatchqueue
- 문법
- uikit
- 알고리즘
- Today
- Total
맛동산이
Swift) Collection과 iteratorProtocol, Sequence, AsyncSequence을 왜 채택하는가?(feat. AsyncStream) 본문
Swift) Collection과 iteratorProtocol, Sequence, AsyncSequence을 왜 채택하는가?(feat. AsyncStream)
진ddang 2023. 8. 28. 15:13Collection
Swift에서는 collection type으로 set, tuple, array, dictionary을 제공하고 있다.
collection타입은 sequence, 와 iterator protocol 두개의 프로토콜을 채택하고 있다.
해당 프로토콜에 대해서 공부하고자 하며 더 나아가 asyncSequence에 대해서 공부해보고자 한다.
Sequence
sequence는 프로토콜로, 해당 프로토콜을 채택하면, 하나하나의 원소를 순회할수 있게 된다.
해당 프로토콜은 make iterator라는 iteratorProtocol을 준수하는 associatedtype(지네릭을 사용하기 위한 플레이스홀더 와 같은 타입)을 정의하고 있다.
이를 통해서 makeIterator 함수를 구현해야하며 해당 메소드를 통해서 iterator를 반환하게 된다.
즉 Sequence 프로토콜은 iterator를 생성하는 역할을 한다.
✔️ 한번에 하나씩 단계(step)별로 진행할 수 있는 값 목록(list of values) ✔️이 sequence이다.
Sequence특징
첫째, 무한하거나 유한합니다.
둘째, 한 번만 이터레이트(iterate) 할 수 있습니다.
한 번 이상 이터레이트할 수도 있지만 한 번 이상 이터레이트가 가능할지에 대해서는 장담할 수 없습니다.
끝을 모르기때문에 한번이상 순회할수 있을지 없을지 모른다는 것이다.
Sequence으로 linkedList와 같은 타입을 만들수있게 된다.
iterator?
iterator은 요소를 순환하여 탐색하는 객체 이다.
즉 collection type의 배열등을 순회하면서 해당 element를 받아오는 객체인것이다.
swift에서는 iterator는, iteratorProtocol을 채택해야 하며, Sequence프로토콜의 핵심이다.
iteratorProtocol
iteratorProtocol은 element라는 associatedtype과 next()라는 함수를 포함하는 프로토콜이다.
element는 iterator가 순회하는 데이터이며, next는 다음 element를 반환하는 메소드이다.
해당 메소드를 통해서 for in loop를 사용할수있게 된다.
해당 프로토콜을 통해서 다음 element를 가져올수 있도록 한다.
즉 Sequence를 통해서 iterator를 생성하고, iteratorProtocol을 통해서 for in loop와 같이 다양한 Sequence를 채택하는( iterator가 존재하는 객체 )를 순회할때 다음 값을 받아오도록 한다.
Collection
Collection은 Sequence를 채택하며, Sequence이다.
하지만 유한하며, 유한하다는것을 알기때문에 collection은 한번이상 이터레이트 할수 있게 된다.
protocol Collection: Sequence { associatedtype Index: Comparable var startIndex: Index var endIndex: Index subscript(position: Index) -> Element { get } func index(after i: Index) -> Index }
Collection 프로토콜은 내부적으로 Index를 포함하며, func index(after i: )를 통해서 현재 그리고 다음 인덱스 값을 받아 올수있다.
정리하자면
- Sequence프로토콜은 collection과 같은 데이터 객체를 순회(이터레이션)하기 위해서 이터레이터를 생성하기 위한 프로토콜이며
- iteratorProtocol이라는 프로토콜은 다음 element를 받아오기 위한, 프로토콜이며
- sequence프로토콜 내부적으로 iteratorProtocol을 채택하고, collection 타입들이 sequence프로토콜을 채택하고 있다.
- 이를 통해서 for in loop와 같은 방법으로 데이터들을 가공하고 사용할수 있게 된다.
AsyncSequence
asyncSequence는 기존의 Sequence와 동일하게 작동한다.
하지만 가장 큰 특징은 asynchronously(비동기적으로) 작동한다는 점이다.
- 한번에 하나씩 단계(step)별로 진행할 수 있는 값 목록을 제공 + 비동기성을 추가한 타입 이다.
- AsyncSequence는 asyncIteratorProtocol를 채택해야한다.
for value in asyncSequence타입 {}
따라서 for in loop 를 사용할수 있게 된다. 대신 비동기기 때문에 언제 데이터가 들어올지 모른다. 따라서 await을 사용할수 있다.
for await in loop
for await value in asyncSequence타입 {}
await키워드가 생기는 이유는 해당 value가 async하기 때문에 언제들어오는 값일지 모르기 때문이다.
또한 해당 부분에서 에러가 발생한다면 try를 포함한
for try await in loop를 사용할수 있다.
for try await value in asyncSequence타입 {}
최종적으로는 다음과 같은 코드가 가능하게 된다.
do { for try await value in asyncSequence타입 { } } catch { }
AsyncStream
AsyncStream은 기존의 AsyncSequence를 준수하기 위해서 이터레이터를 수동적으로 구현하지 않고도 비동기 시퀀스(asyncSequence를) 생성하기 위한 간편한 데이터 구조이다.
즉 이전의 AsyncSequence에서 타입을 이터레이터를 정의하고, 안의 element 혹은 next와 같은 함수들을 구현하지 않고도, 편리하게 AsyncSequence를 생성하기 위한 인터페이스 인것 이다.
💡 AsyncSequence는, 비동기적으로 데이터를 받아오고 해당 값을 순회하기 위한 프로토콜이다.
정리
sequence는 for in loop를 사용하기 위한, 즉 이터레이트 하기 위해서 채택하는 프로토콜
iteratorProtocol은 sequence가 이터레이트하기 위해서 이터레이터를 만들며, 다음 값을 가져오기 위해 채택하는 프로토콜
asyncSequence는 for in loop에서 await 키워드를 사용하여 값을 비동기적으로 받아온것을 순회하기 위해서 채택하는 프로토콜
'앱 > Swift' 카테고리의 다른 글
Swift) rethrows란 (0) | 2023.08.28 |
---|---|
Swift) Appstorage와 userDefault (0) | 2023.08.28 |
Swift) 소수점 다루기 (0) | 2023.08.18 |
Swift) Task, TaskGroup, .task와 dispatchQueue (0) | 2023.07.04 |
Swift) Async, Await 사용하는 법 (0) | 2023.07.04 |