프로그래밍Swift 개발자

Swift에서 Dictionary 데이터 구조는 어떻게 작동합니까? 최적의 사용을 위해 고려해야 할 구현의 특징은 무엇이며 복잡한 키를 저장하고 처리할 때 발생할 수 있는 어려움은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

응답.

Dictionary는 Swift의 연관 컨테이너로, "키-값" 쌍을 저장합니다. 키는 고유성을 보장하고 요소에 대한 상수 시간 접근을 위해 HashableEquatable 프로토콜을 구현해야 합니다.

특징:

  • 키는 고유해야 합니다.
  • 접근, 추가 및 제거는 평균적으로 O(1)에서 발생합니다.
  • 복잡한 키 사용이 가능합니다. 단, 명시적으로 HashableEquatable을 구현해야 합니다.

예:

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을 구현하는 것을 잊었습니다. 결과적으로 동일한 매개변수를 가진 요소들이 서로 다른 키로 간주되어 중복이 발생하고 딕셔너리 검색에서 오류가 발생했습니다.