티스토리 뷰
제네릭을 잘 사용하면 중복코드를 줄일 수 있고 깔끔하게 사용할 수 있습니다.
정리겸 한번 이곳에 끄적여봅니다.
사실 Swift 표준 라이브러리들은 수많은 제네릭 코드로 구성이 되있습니다.
대표적인 예시는 Array, Dictionary, Set등의 타입은 모두 제네릭 컬렉션입니다.
Int,String등을 요소로 갖는 배열을 만들거나 하는것이 가능한것도 이 제네릭 덕분인데요
사용법을 한번 알아보겠습니다.
제네릭을 사용하고자 할 경우에는 제네릭이 필요한 타입 또는 메서드 이름 두에 <타입>를 써주어 제네릭을 사용할 것임을 표시합니다.
제네릭을 사용하고자 하는 타입 이름 <타입 매개변수>
제네릭을 사용하고자 하는 함수 이름 <타입 매개변수> (함수의 매개변수 ...)
간단한 예시를 들어볼까요?
func swapTwoInts(_ a: inout Int, _ b: inout Int)
{
let tempA = a
a = b
b = tempA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, & anotherInt)
print("someInt: \(someInt)")
print("anotherInt: \(anotherInt)")
// prints
// someInt: 107
// anotherInt: 3
위의 코드를 Double이나 String 타입으로 변경하고자하면 함수 새로만들거나
혹은 인자를 Any, AnyObject를 받는 방법이 있습니다. 하지만 Any를 받게되면 한쪽은 Int 다른 한쪽은 String을 넣어버릴경우
같은 타입의 값을 교체하게 하고자하는 위 코드의 의도와는 벗어나게 되는 문제가 생깁니다.
그래서 제네릭을 사용하면 아래와같이 깔끔하게 해결할 수 있습니다.
func swapTwoInts<T>(_ a: inout T, _ b: inout T)
{
let tempA: T = a
a = b
b = tempA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, & anotherInt)
print("someInt: \(someInt)")
print("anotherInt: \(anotherInt)")
// prints
// someInt: 107
// anotherInt: 3
제네릭 함수는 실제 타입 이름 Int, String 등을 써주는 대신
위 예제에서는. T를 사용합니다.
T는 타입파라미터입니다.
보통 타입파라미터를 여러개 사용하게될 경우 콤마로 구분을 해줍니다. Ex) <T,U,V> 등등..
T의 실제 타입은 함수가 호출되는 그 순간 결정이됩니다.
보통 파마리터의 이름은. T나 MyType같이 대문자 카멜 케이스를 사용합니다.
보통 대문자로 된 이름은 값(Value)이 아니라 타입(type)을 의미합니다.
'개발 > Swift' 카테고리의 다른 글
Swift - Subscripts (0) | 2020.11.14 |
---|