01 정의
제네릭은 동일한 작업을 수행하는 함수의 유형을 변경하려는 경우 모든 유형에 맞는 불필요한 함수 설계를 줄일 수 있습니다.
코드를 보면 쉽게 알 수 있습니다.
var someNum1 = (0, 1, 2, 3, 4)
var someDoubleNum1 = (0.1, 0.2, 0.3, 0.4)
var someString1 = ("Swift", "Developer", "Apple")
func someGenerics(array: (Int)) {
for int in array {
print(int)
}
}
func someGenerics1(array: (Double)) {
for double in array {
print(double)
}
}
func someGenerics2(array: (String)) {
for string in array {
print(string)
}
}
someGenerics(array: someNum1) // 0, 1, 2, 3, 4
someGenerics1(array: someDoubleNum1) // 0.1, 0.2, 0.3, 0.4
someGenerics2(array: someString1) // "Swift", "Developer", "Apple"
위의 코드는 동일한 작업을 수행하지만 유형이 모두 다릅니다.
이 경우 수고를 덜기 위해 포괄적인 기능을 설계하고 중복되는 기능을 하나로 통합하는 것이 가능하다.
02 일반적인 기능적 디자인
1) 타입 파라미터 지정
2) 타입 매개변수를 이용한 함수 설계
기능 함수 이름
이렇게 하면 일반 함수를 쉽게 설계할 수 있습니다.
즉, 한번의 구현으로 모든 타입을 커버할 수 있는 기능으로 유지보수성과 재사용성을 고려한 효율적인 설계가 가능합니다.
func someGenericsFunc<T>(a: inout (T)) {
//배열이 아니라면 그냥 T
for element in a {
print(element)
}
}
someGenericsFunc(a: &someNum1)
someGenericsFunc(a: &someDoubleNum1)
someGenericsFunc(a: &someString1)
//타입 파라미터의 이름은 아무거나 해도 상관없다
func someGenericsFunc<TOT>(a: inout (TOT)) {
for element in a {
print(element)
}
}
someGenericsFunc(a: &someNum1) // 0, 1, 2, 3, 4
someGenericsFunc(a: &someDoubleNum1) // 0.1, 0.2, 0.3, 0.4
someGenericsFunc(a: &someString1) // "Swift", "Developer", "Apple"