함수 선언시 제네릭
func swap<T>(left: inout T, right: inout T) {
let tempLeft = left
left = right
right = tempLeft
}
var left = 1
var right = 2
swap(&left, &right)
구조체 및 클래스 선언시 제네릭
struct Stack<T> {
let items: [T] = []
}
let stack: Stack<Int> = Stack()
제네릭 타입 제약
func isSame<T: Equatable>(a: T, b: T) -> Bool {
return a == b
}
- Equatable 프로토콜을 준수하는 인스턴스만 T파라미터로 받을 수 있다.
- T: class명 으로 주면 해당 클래스 혹은 클래스를 상속한 클래스만 올 수 있다.
제네릭 확장
extension Array {
mutating func pop() -> Element {
return self.removeLast()
}
}
- 제네릭 타입을 확장하면서 타입파라미터를 사용할 경우, 실제 Array 구현부에서 타입 파라미터가 Element 이므로, 동일하게 Element라고 지정 해야 한다.
extension Array where Element: FixedWidthInteger {
mutating func pop() -> Element { return self.removeLast() }
}
let num = [1, 2, 3]
let strs = ["a", "b", "c"]
nums.pop() // O
strs.pop() // X
- extension 으로 타입 파라미터에 where 로 제약 조건을 주고 메소드를 추가하면, 제약조건을 준수하지 않는 Element는 해당 메소드를 사용할 수 없다.