제네릭은 swift에서 유연하고 재사용 가능하게 해주는 코드 활용인데
중복사용을 피하게 해주고 명확하지만 추상적인 코딩을 가능하게 해준다
제네릭의 예제를 살펴보면서 이해해보자
아래는 일반적인 swap코드입니다.
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
이렇게 작성하면 input으로 Int만 받을 수 있으니 Double이나 Float, String등등 다른 형식에 사용하려면 추가적인 함수를 아래 줄줄이 기재하고 비슷한 코드들이 줄줄이 이어지는데
제네릭을 활용하면 이를 해결할 수 있습니다.
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
Type Parameters
함수 이름뒤에 작성되며 함수가 호출될 때마다 실제 타입으로 즉시 대체됩니다.
이 덕에 위에서 보듯이 변수 타입과 상관없이 다른타입이여도 하나의 함수로 재사용 할 수 있게 되죠
Dictionary<Key, Value>, Array<Element> 처럼 <>안에 T를 대체하는 이름으로 설명이 붙지만 큰 의미가 없는 경우는 T나 U를 사용합니다.
struct IntStack {
var items: [Int] = []
mutating func push(_ item: Int) {
items.append(item)
}
mutating func pop() -> Int {
return items.removeLast()
}
}
일반적으로 작성한 Int형 스택입니다
이것을 제네릭으로 변환하면
struct Stack<Element> {
var items: [Element] = []
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
}
제네릭 버전의 스택인데 이를 활용하는 코드는
var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
stackOfStrings.push("cuatro")
// the stack now contains 4 strings
이런식으로 제네릭은 어디 하나에서 국한되는게 아닌 다양하게 활용 할 수 있습니다.
공식 가이드 : https://docs.swift.org/swift-book/LanguageGuide/Generics.html