Sequence 란?
순차적으로 인자값에 접근하게 해주는 편리한 녀석이라고 합니다.
struct Countdown: Sequence, IteratorProtocol {
var count: Int
mutating func next() -> Int? {
if count == 0 {
return nil // 없으면 무한루프에 빠짐
}
defer {
count -= 1
}
return count
}
}
이런식으로 Sequence을 따르는 Countdown이란 녀석을 만들어보았습니다.
IteratorProtocol은 Sequence를 만드는데 필수적으로 따라야하는 프로토콜로서
Sequence값을 만드는 팩토리 역할을 수행합니다.
let threeTwoOne = Countdown(count: 3)
for count in threeTwoOne {
print("\(count)...") // 3.. 2.. 1..
}
이런식으로 for-loop문에 사용할 수 있습니다.
만약 "next()"에서 nil값이 오는 경우가 없다면 무한루프가 되므로 조심하셔야합니다.
print(threeTwoOne.map { $0 * 3 }) // [9, 6, 3]
print(threeTwoOne.filter { $0 / 2 == 0 }) // [1]
print(threeTwoOne.reduce(0){ $0 + $1 }) // 6
이런식으로 Sequence을 따르는 곳에 사용될 수 있는 여러 고차함수에 사용될 수 있습니다.
편리한 기능이긴한데 실 업무에서 사용될 부분이 있을지는 아직 잘 모르겠습니다.
Array나 Dictionary는 Collection 타입을 따르고 Collection은 Sequence을 따르기 때문에 Array나 Dictionary를 쓰는 자료형이라면 기본적으로 Sequence기능을 사용할 수 있습니다.
그 외에 따로 Sequence을 상속하면서 사용할 일이 있을지는 음...
예시로 든 Countdown도 솔직히 "for count in (1...3).reversed()"로 바로 사용하는게 더 가독성 있다고 생각들기도 합니다.
그래도 알고 있으면 언젠가는 쓰지 않겠습니까? 허허 🤔