콘텐츠로 건너뛰기
Home » 배열리터럴로 만들 수 있는 클래스 정의하기

배열리터럴로 만들 수 있는 클래스 정의하기

ExpressibleByArrayLiteral

Set 인스턴스를 만들 때, Array와 같이 [1, 2, 3] 와 같은 식으로 배열 리터럴을 이용해서 초기화하는 것이 가능하다. 이렇게 배열 리터럴을 이용해서 초기화할 수 있는 것은 ExpressibleByArrayLiteral이라는 프로토콜을 따를 때 가능해지는 것으로, 커스텀 집합 혹은 컨테이너 타입을 만들 때, 이 프로토콜을 준수하면 배열리터럴로 해당 타입을 생성하는 것이 가능해진다.
이 프로토콜은 init(arrayLiteral:) 구현해주면 된다. 일전에 예제로 만들어 본 바 있는 Stack의 경우에도 이를 적용할 수 있다. 이 이니셜라이저는 실제로 [T] 타입의 배열로 된 인자를 받아서 각 원소들을 사용해서 스스로를 구성하게 되면 된다. 스택의 경우 배열을 받고 순서대로 자신에게 푸시하면 된다.

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