-
Swift - Generic Type ConstraintProgramming/Swift 2022. 1. 25. 17:34
안녕하세요 BeePeach입니다 :)
오늘 공부해볼 내용은 Generic의 Type Constraint입니다.
지금까지 우리가 generic의 타입 파라미터를 사용할 때 모든 타입을 사용할 수 있었습니다.
하지만 어떤 기능만 가진 타입들만 오게하고싶거나 특정 타입으로 선언하지 않으면 에러가 발생하는 경우가 있습니다.
이렇게 타입 파라미터에 모든 타입이 아니라 몇몇 타입들만 오게 하는 기능이 바로 Type Constraint(타입 제약)입니다.
Type Constraint
Generic Type, Generic Funtuion, Associated Type에서 타입 파라미터를 사용할 때 타입 파라미터가 특정 class, protocol을 상속하게 하면 type constraint를 사용할 수 있습니다.
Class와 Protocol만 가능합니다.
Struct, Enum으로 특정할 수는 없습니다.
Syntax
문법은 타입파라미터이름 뒤에 :(colon)과 함께 class, protocol을 적어주면 됩니다.
위 예제에서는 T는 someClass를 상속한 타입만 올 수 있으며 U는 someProtocol을 채용한 타입만 올 수 있습니다.
예시를 한번 들어보겠습니다.
findIndex(ofString:in:) 함수는 Non-Generic func입니다.
String배열에서 파라미터로 전달한 String이 존재하는지 확인하고 존재한다면 해당 index를 리턴해주는 함수입니다.
이 함수는 index를 리턴해주므로 다른 타입에서도 사용할 수 있는 여지가 있습니다.
하지만 이전에 같이 공부해봤듯이 이 함수는 String을 찾을때에만 사용할 수 있습니다.
Int, Double, .... 여러 Type에서 사용하고 싶어도 사용할 수 없죠.
그럼 이제 우리는 Generic을 공부했으니 이 함수를 모든 타입에서 사용할 수 있는 함수로 바꿀 수 있겠죠??
우리가 공부한대로 타입 파라미터 T를 이용해서 코드를 수정했습니다.
그런데 에러가 발생합니다....
왜 그럴까요??
이 함수 내부에서는 ==을 이용해서 타입 T인 value와 valueToFind이 같은지 비교하고 있습니다.
그런데 모든 타입을 다 같은지 다른지 비교할 수 있나요??
Swift에서 제공해주는 기본 타입들은 ==을 이용해서 같은지 다른지 판단이 가능하지만 우리가 custom으로 만든 타입은 ==을 이용해서 같은지 다른지 판단할 수 없습니다.
우리는 protocol 포스팅에서 이 이유를 배웠죠??
그 이유는 Equtable 프로토콜을 채용했냐 안했냐의 차이였습니다.지금 타입 파라미터 T는 모든 타입을 의미합니다. 그래서 T를 ==로 비교할 수 없는 것입니다.
==로 비교하기 위해서는 적어도 T가 Equtable을 채용하고 있어야 합니다.
T: Equatable을 적어주니 에러가 사라졌습니다.
이제 여기서 타입 파라미터의 의미는 "어떤 타입이 올지 모르지만 여기 올 수 있는 타입은 반드시 Equatable을 채용하는 타입이야!"가 됩니다.
그래서 이제 value와 valueToFind는 ==로 비교할 수 있게 되었고 에러가 사라진 것입니다.
참고 자료
https://docs.swift.org/swift-book/LanguageGuide/Generics.html
728x90'Programming > Swift' 카테고리의 다른 글
Swift - UserDefaults에 customType 저장하기 (0) 2022.03.01 Swift - reduce(_:_:)와 reduce(into:_:) (0) 2022.01.29 Swift - Generic Type 확장하기 (0) 2022.01.24 Swift - Associated Type (0) 2022.01.19 Swift - Generic Type (0) 2022.01.18