Open Phangg opened 7 months ago
Phang 의 생각 그냥 단어 뜻 그대로의 의미를 갖는 하나의 프로토콜이구나.. ( 프로토콜로 존재하는지 몰랐음 ) 아, Collection (Array, Set, Dictionary 등) 이 Sequence 프로토콜을 채택하는 관계인가보다. Sequence 프로토콜을 더 파헤치면서, Collection 도 봐야겠다.
for-in
루프로 확인 커스텀을 해야하는 일이 있나.. 하는 생각이 들었는데, 일반적인 구조체에서도 Sequence 의 다양한 작업을 수행할 수 있으니..?
Phang 이라는 구조체를 만들어 보았다
당연하게도, 구조체를
for-in
루프를 통해 확인 할 수 없음 에러메세지를 보면, Phang 이 Sequence 를 따르지 않는다고 함
그렇다면, Phang 에서 Sequence 프로토콜을 채택해보자
struct Phang: Sequence { }
를 해줘도 에러가 남
찾아보니, makeIterator()
메서드와 IteratorProtocol
을 채택한 Iterator
와 next()
메서드 를 작성해줘야 한다고 함
makeIterator() 는 아래와 같이 선언 되어야 함
func makeIterator() -> some IteratorProtocol {
// ..
}
IteratorProtocol
을 채택하는 타입을 외부에 따로 만들수도 있고, 그냥 바로 Phang 구조체에서 코드를 작성할 수 있음
// 외부에서 Iterator 관련 구조체를 만드는 경우
struct PhangIterator: IteratorProtocol {
typealias Element = Int
var value = 1
mutating func next() -> Element? {
if value > 5 { return nil }
defer { value += 1 }
return value
}
}
struct Phang: Sequence { func makeIterator() -> some IteratorProtocol { PhangIterator() } }
```swift
// Phang 구조체에서 한번에 진행하는 경우
struct Phang: Sequence, IteratorProtocol {
typealias Element = Int
var value = 1
mutating func next() -> Element? {
if value > 5 { return nil }
defer { value += 1 }
return value
}
}
for-in
루프가 실행 됨
let phang = Phang()
for value in phang {
print(value) // 1 2 3 4 5 (실제로는 한줄씩 출력)
}
protocol Collection: Sequence {
associatedtype Index: Comparable
var startIndex: Index
var endIndex: Index
subscript(position: Index) -> Element { get }
func index(after i: Index) -> Index
}
Phang 의 생각 위 사진처럼 재정의를 해주고 있지만... 어 그런데, Sequence 를 채택한 Collection 에서
next()
메서드가 없는데..? 필요한게 아니었나? 해서 찾아보니, 커스텀 컬렉션에서는 next()를 정의하지 않아도 된다고 함 왜?
next()
와 같은 동작이 이루어 진다고 함
for-in
루프를 만났을 때let arr = [1, 2, 3]
for value in arr {
print(value) // 1 2 3
}
var iterator = arr.makeIterator()
while let value = iterator.next() {
print(value) // 1 2 3
}
Swift의 Sequence와 Collection 프로토콜에 대해 설명해주세요.