티스토리 뷰

macOS, iOS

[swift] Generics(제너릭스, T)

SweetDev 2019. 7. 8. 12:01

[제너릭스 : 변수를 타입에서 자유롭게 해주는 문법] 이라고 정의되어 있다. 

 

처음 제너릭스 (또는 T)를 소스에서 보면 매우 당황스럽고 어렵게 느껴질 수 있다. 

하지만 제너릭스는 생각보다 아무것도 아니다 ㅎㅅㅎ 그냥 타입이 안정해진것 뿐!!

 

제너릭스를 쓰고 싶으면 평소에 타입을 쓰던 곳에, <T>와 T 를 써주면 된다. 

 

 

 

 

애플에서 제공하는 예제이다. 

Int를 스왑하는건 별로 어렵지 않았다. 

 

 

 

[inout이 뭔지 모른다면?]

inout을 대략적으로 설명하면, inout을 파라미터에 달아주면, 파라미터로 들어온 값을 바꿔줄 수 있게 된다. 

바뀐 값은 바깥의 원래 변수에도 반영된다 !.! inout에 변수를 쓸때는 변수 이름 앞에 &를 붙여줘야 한다. 

이렇게 하면 바깥에 있는 myNum도 20으로 바뀐다. 

 

 

 

하지만 내가 Int 말고도, String, Double에 대해서도 Swap을 하고 싶다면, 각각 타입에 대한 함수를 다 만들어줘야 한다. 꽤 짜증나는 일이다. 

 

딱 봐도 넘나 낭비인것...

'

 

그래서, 쟤네 3개를 퉁칠 수 있는 함수를 하나 만들었다. 

 

함수 이름 옆에 붙은 <T>가 되게 궁금했었는데, 제드님 글을 읽고 이해하게 되었다. 

 

Generics 함수는 함수 이름 옆에, Placeholder 타입 이름이 온다. 

우리는

이렇게 써줬지만,

 

이렇게 써줘도 아무 상관이 없는 것이다. 그냥 예약어다!!!!!

그리고 타입이 여러개 들어가도 상관없다. 쉼표로 구분해주면 된다. 

 

 

 

내가 작성한 Property Wrapper 글에 있던 예제 소스이다. 

 

내가 짠건 아니고 애플이 제공한거긴 하지만...

 

 

Type Constraint

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    // function body goes here
}


출처: https://zeddios.tistory.com/226 [ZeddiOS]

 

T는 SomeClass의 하위 클래스여야 하고, U는 SomeProtocol을 준수해야 한다고 제한을 줄 수 있다. 

 

 

 

SwiftUI에서 이 generice의 중요도가 더 올라갔는데...

struct UnderlineTextFieldView<T>: View where T: View {
}

이런식으로 쓰고, where 절을 사용해서 지정도 할 수 있다. 

 

where에 대한 정리는 다음에 ...//TODO

 

 

제너릭스는 코딩을 잘 하는 사람들 소스를 뒤지다 보면 꽤 자주 보인다. (하지만 엄청엄청 자주까지는 아니였음... )

 

Swift의 표준 라이브러리는 제너릭으로 구현되어 있다고 한다. 

 

나도 자주, 잘 쓰고싶은 문법 중에 하나이다!!

 

 

[애플의 Generics 문서]

 

[zedd님의 Generics]

 

 

'macOS, iOS' 카테고리의 다른 글

Equatable  (0) 2019.07.08
[RxSwift] Rx 처음 시작하기  (0) 2019.07.08
Xcode 단축키들  (0) 2019.07.05
[Swift] Closure - $0, escaping, autoclosure  (0) 2019.07.05
iOS 버전 체크를 하는 올바른 코드  (0) 2019.07.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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 29 30
글 보관함