(Swift) 집합 자료 타입을 배열리터럴로 정의하는 법

ExpressibleByArrayLiteral

Set 인스턴스를 만들 때, Array와 같이 [1, 2, 3] 와 같은 식으로 배열 리터럴을 이용해서 초기화하는 것이 가능하다. 이렇게 배열 리터럴을 이용해서 초기화할 수 있는 것은 ExpressibleByArrayLiteral이라는 프로토콜을 따를 때 가능해지는 것으로, 커스텀 집합 혹은 컨테이너 타입을 만들 때, 이 프로토콜을 준수하면 배열리터럴로 해당 타입을 생성하는 것이 가능해진다.

이 프로토콜은 init(arrayLiteral:) 구현해주면 된다. 일전에 예제로 만들어 본 바 있는 Stack의 경우에도 이를 적용할 수 있다.

struct Stack<T> {
  var data: [T] = []
  var isEmpty: Bool { return data.isEmpty }
  var top: T? { return data.last }
  mutating func push(_ e: T) { data.append(e) }
  @discardableResult mutating func pop() -> T {
    return data.removeLast()
  }
}

extension Stack: ExpressibleByArrayLiteral {
  init(arrayLiteral elements: T...) {
    self.init()
    elements.forEach{ push($0) }
  }
}

var s: Stack<Int> = [3, 2, 1, 5, 4]
while !s.isEmpty {
  print(s.pop())
}
/* 4, 5, 1, 2, 3