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