티스토리 뷰

개발/Swift

Swift 제네릭

류익환 2020. 9. 13. 15:37
반응형

제네릭을 잘 사용하면 중복코드를 줄일 수 있고 깔끔하게 사용할 수 있습니다.

정리겸 한번 이곳에 끄적여봅니다.

 

사실 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함