Equatable / Comparable / Hashable
우리가 만든 타입끼리 비교를 하고싶은데, 안된다는 오류가 뜬다.
왜 Int / String 등 기본 타입은 비교가 가능한데, 내가 만든 타입은 안돼?
기본 타입은 아래에 나올 프로토콜들이 이미 채택되어있어 컴파일러가 자동으로 구현해주기 때문이야!
적절한 프로토콜을 채택하렴
Equatable
- 동일성(Equality)을 비교(==)할 수 있도록 하는 프로토콜이다.
- Comparable, Hashable의 기반 프로토콜이다.
- 구조체의 경우, 모든 저장 프로퍼티가
Equatable
을 채택해야하며- 열거형의 경우, 모든 연관 값들이
Equatable
을 채택해야 한다.
(연관 값이 없는 경우, 컴파일러가 자동으로 채택해줌)
☑️ 예시 코드
extension Test: Equatable {
static func == (lhs: Test, rhs: Test) -> Bool {
}
}
Comparable
- 값의 대/소를 비교할 수 있는 프로토콜이다.
- 부등호 (> , >=, <, <=) 로 비교 연산이 가능해지며, 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 {
}
}
Hashable
- 임의의 길이를 갖는 데이터(key)를 고정된 길이의 데이터(value)로 매핑하는
Hashing
기능을 구현하는 프로토콜이다. (정수 Hash 값 제공)- 만든 타입을 Set이나, Dictionary Key 값으로 사용하고 싶을 때 구현
✅ Hash란 ?
- 해시 함수에 의해 얻어지는 값이다.(해시 값, 해시 코드 라고도 함)
- 매우 빠른 데이터 검색을 위한 컴퓨터 소프트웨어에서 사용하며, 중복 값도 검색할 수 있다.
(해시 값 변환 후, index와 매칭해 빠르게 찾음)
✅ Hashable은 Equatable을 왜 상속해야 하는가?
-
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
Author And Source
이 문제에 관하여(Equatable / Comparable / Hashable), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jee/Equatable-Comparable-Hashable저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)