Dictionary는 Swift의 연관 컨테이너로, "키-값" 쌍을 저장합니다. 키는 고유성을 보장하고 요소에 대한 상수 시간 접근을 위해 Hashable 및 Equatable 프로토콜을 구현해야 합니다.
특징:
Hashable 및 Equatable을 구현해야 합니다.예:
struct EmployeeID: Hashable { let company: String let id: Int } var employees: [EmployeeID: String] = [ EmployeeID(company: "A", id: 1): "Alice", EmployeeID(company: "B", id: 2): "Bob" ] let empName = employees[EmployeeID(company: "A", id: 1)] // Alice
Dictionary가 Hashable을 구현하지 않은 사용자 정의 타입을 키로 받을 수 있습니까?
— 부적절합니다. 타입이 Hashable을 구현하지 않으면 키로 사용할 수 없습니다. 사용하려고 하면 컴파일 오류가 발생합니다.
예:
class Foo {} var dict: [Foo: Int] = [:] // 오류: Foo는 Hashable을 구현하지 않음
이야기
프로젝트에서 배열 아이템을 포함한 구조체를 기반으로 Dictionary 키를 저장했습니다. 해당 구조체가 Hashable 프로토콜을 준수하지 않아 Dictionary가 작동하지 않았습니다. 솔루션: 모든 필드를 포함하는 고유한 hashValue를 구현했습니다.
이야기
키로서 NSObject 하위 클래스를 사용하면서 객체의 주소에 의존했습니다. 코드 일부를 구조체로 변경한 후 데이터가 일치하지 않게 되었습니다: 구조체의 해시 값 계산 방법이 달라져 데이터 접근이 불가능해졌습니다.
이야기
복잡한 키를 가진 딕셔너리를 저장할 때 Equatable을 구현하는 것을 잊었습니다. 결과적으로 동일한 매개변수를 가진 요소들이 서로 다른 키로 간주되어 중복이 발생하고 딕셔너리 검색에서 오류가 발생했습니다.