본문 바로가기
iOS와 그 외/Swift

[Swift] EnumeratedSequence

by lody.park 2024. 6. 25.

https://developer.apple.com/documentation/swift/enumeratedsequence

 

EnumeratedSequence | Apple Developer Documentation

An enumeration of the elements of a sequence or collection.

developer.apple.com

 

트리거가 된 코테 구문

 let dic = friends.enumerated().reduce(into: [String: Int]()) { $0[$1.element] = $1.offset }

 

Swift 공식문서에서는 EnumeratedSequence를 다음과 같이 정의한다.

 

Sequece 또는 Collection의 Element 열거.

@frozen
struct EnumeratedSequence<Base> where Base : Sequence

 

EnumeratedSequence는 쌍 (n, x)의 시퀀스이며, 여기서 n은 0에서 시작하는 int 값이며 x들은 base sequence의 element입니다.

var s = ["foo", "bar"].enumerated()
for (n, x) in s {
    print("\(n): \(x)")
}

// 0: foo
// 1: bar

 

EnumeratedSequence<Base>.Iterator where Base: Sequence

func next() -> Element? 

- nil 반환하면 후속 element는 전부 nil

typealias Element = EnumeratedSequence<Base>.Iterator.Element = (offset: Int, element: Base.Element)

var s = ["foo", "bar"]
var t = s.enumerated()
var iter = t.makeIterator()
while let val = iter.next() {
  print("\(val.element) \(val.offset)")
}
struct Lody: Sequence {
  func makeIterator() -> some IteratorProtocol {
    LodyIterator()
  }
}

struct LodyIterator: IteratorProtocol {
  typealias Element = Int
  var current = 1
  
  mutating func next() -> Element? {
    if(current > 10) { return nil }
    defer { current += 1 }
    return current
  }
}

// Lody2 타입 자체가 Iterator로 행동할 수 있게 해줌.
struct Lody2: Sequence, IteratorProtocol {
  
  typealias Element = Int
  var current = 1
  
  mutating func next() -> Element? {
    if(current > 10) { return nil }
    defer { current += 1 }
    return current
  }
}

 

https://academy.realm.io/kr/posts/try-swift-soroush-khanlou-sequence-collection/

 

Swift의 Sequence와 Collection에 대해 알아야 하는것들

소 개 저는 오늘 강연을 맡은 Soroush입니다. 이번 강연에서는 많은 분이 궁금해하시는 Sequence와 Collection에 대해 알아보도록 하겠습니다. 정렬된 요소들의 목록이 필요할 경우, Swift 언어에서는 대

academy.realm.io