타입에 의존하지 않는 범용 코드를 작성할 때 사용.
중복을 피하고, 코드를 유연하게 작성할 수 있게 한다.
① 두 인자를 파라미터로 같은 Int타입 값을 받고, 그 둘을 swap 하는 함수를 만들고 싶다.
func swapTwoInts(_ a: inout Int, _ b: inout Int )
let tempA = a
a = b
b = tempA
② 파라미터가 모두 Int인 경우, 잘 동작함. 그러나 타입이 다르면 사용할 수가 없다. But, 나는 다른 타입을 인자로 받으면서 동일한 내용을 가진 함수를 사용하고 싶다?
// 예를 들어서 Double을 인자로 받고 싶은 경우:
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
let tempA = a
a = b
b = tempA
}
// String을 인자로 받고 싶은 경우:
func swapTwoStrings(_ a: inout String, _ b: inout String) {
let tempA = a
a = b
b = tempA
}
③ 아 같은 내용을 반복하기 번거롭다... 하면 😮💨
이럴때 쓰는 것이 바로 제네릭(Generics). 타입에 제한을 두지 않는 코드를 작성할 때 쓴다.
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let tempA = a
a = b
b = tempA
}
❗️여기에 사용된 이 T를 Type Parameter라고 부르는데 T라는 새로운 형식이 생성되는 것이 아니라,
실제 함수가 호출될 때 해당 매개변수의 타입으로 대체 되는 Placeholder이다.❗️
// 함수 호출 시 T는 Int 타입으로 결정됨
var firstInt = 1
var secondInt = 100
swapTwoValues(&firstInt, &secondInt)
// 함수 호출 시 T는 String 타입으로 결정됨
var firstString = "Hello"
var secondString = "Good Bye"
swapTwoValues(&firstString, &secondString)
이런 식으로 실제 함수를 호출할 때, T의 타입이 결정된다.