우리가 만든 타입끼리 비교를 하고싶은데, 안된다는 오류가 뜬다.
왜 Int / String 등 기본 타입은 비교가 가능한데, 내가 만든 타입은 안돼?
기본 타입은 아래에 나올 프로토콜들이 이미 채택되어있어 컴파일러가 자동으로 구현해주기 때문이야!
적절한 프로토콜을 채택하렴
- 동일성(Equality)을 비교(==)할 수 있도록 하는 프로토콜이다.
- Comparable, Hashable의 기반 프로토콜이다.
- 구조체의 경우, 모든 저장 프로퍼티가
Equatable
을 채택해야하며- 열거형의 경우, 모든 연관 값들이
Equatable
을 채택해야 한다.
(연관 값이 없는 경우, 컴파일러가 자동으로 채택해줌)
☑️ 예시 코드
extension Test: Equatable {
static func == (lhs: Test, rhs: Test) -> Bool {
}
}
- 값의 대/소를 비교할 수 있는 프로토콜이다.
- 부등호 (> , >=, <, <=) 로 비교 연산이 가능해지며, sequence나 collection등에서 정렬 등의 추가 기능을 사용할 수 있게 된다.
Comparable
프로토콜은Equatable
을 상속받기 때문에, 클래스에서는 반드시Equatable
도 구현을 해줘야 한다.
(구현 안하면, 에러 문구가 뜸)
☑️ 예시 코드
// 구조체, 열거형의 경우
extension Test: Comparable {
static func < (lhs: Test, rhs: Test) -> Bool {
}
}
// 클래스의 경우
extension Test: Comparable {
static func == (lhs: Test, rhs: Test) -> Bool {
}
static func < (lhs: Test, rhs: Test) -> Bool {
}
}
- 임의의 길이를 갖는 데이터(key)를 고정된 길이의 데이터(value)로 매핑하는
Hashing
기능을 구현하는 프로토콜이다. (정수 Hash 값 제공)- 만든 타입을 Set이나, Dictionary Key 값으로 사용하고 싶을 때 구현
Swift의 set
, dictionary
의 Key는 반드시 Hash
가 가능한 타입이어야 한다.
또, combine 파라미터로 전달하는 프로퍼티는 반드시 Hashable을 준수하고 있어야 한다.
고유한 값이여야 한다는 뜻
때문에, 고유한 값(hashValue)
인지 식별해줄 수 있는 Equatable
를 상속해야 한다.
참고문서
1. https://jcsoohwancho.github.io/2019-10-27-Equatable,-Comparable,-Hashable/
2. https://babbab2.tistory.com/148
3. https://babbab2.tistory.com/150?category=828998
4. https://babbab2.tistory.com/149?category=828998