Dictionary is een associatieve container in Swift die "sleutel-waarde" paren opslaat. Sleutels moeten de protocollen Hashable en Equatable implementeren om uniciteit en constante toegangstijd tot elementen te waarborgen.
Kenmerken:
Hashable en Equatable expliciet zijn geïmplementeerd.Voorbeeld:
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
Kan een Dictionary een gebruikersgedefinieerd type accepteren dat niet Hashable implementeert als sleutel?
— Niet correct. Als een type Hashable niet implementeert, kan het niet als sleutel fungeren. Pogingen om dit te gebruiken leiden tot een compilatiefout.
Voorbeeld:
class Foo {} var dict: [Foo: Int] = [:] // Fout: Foo implementeert geen Hashable
Verhaal
In een project werden sleutels in Dictionary gebaseerd op structuren met arrays binnenin opgeslagen. De structuur voldeed niet aan de Hashable-protocol, waardoor de Dictionary niet werkte. Oplossing: implementeer een eigen hashValue die rekening houdt met alle velden, inclusief arrays.
Verhaal
We gebruikten NSObject-subklassen als sleutels, vertrouwend op het adres van het object. Na het herschrijven van een deel van de code naar structuren, klopten de gegevens niet meer: de hashwaarden van structuren werden anders berekend, wat leidde tot verlies van gegevensbeschikbaarheid.
Verhaal
Bij het opslaan van een woordenboek met een complexe sleutel vergaten we Equatable te implementeren. Het resultaat was dat elementen met dezelfde parameters als verschillende sleutels werden beschouwd, er duplicaten ontstonden en fouten optraden bij het zoeken in het woordenboek.