Dictionary è un contenitore associativo in Swift che memorizza coppie "chiave-valore". Le chiavi devono implementare i protocolli Hashable e Equatable per garantire l'unicità e il tempo di accesso costante agli elementi.
Caratteristiche:
Hashable e Equatable sono implementati esplicitamente.Esempio:
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
Un Dictionary può accettare un tipo personalizzato come chiave che non implementa Hashable?
— Scorretto. Se il tipo non implementa Hashable, non può fungere da chiave. Tentare di utilizzarlo porterà a un errore di compilazione.
Esempio:
class Foo {} var dict: [Foo: Int] = [:] // Errore: Foo non implementa Hashable
Storia
In un progetto memorizzavano chiavi Dictionary basate su strutture con array all'interno. La struttura non soddisfaceva il protocollo Hashable, causando il malfunzionamento del Dictionary. Soluzione: implementare un proprio hashValue che considerasse tutti i campi, inclusi gli array.
Storia
Utilizzavano sottoclassi NSObject come chiavi, basandosi sull'indirizzo dell'oggetto. Dopo aver riscritto parte del codice utilizzando strutture, i dati hanno smesso di corrispondere: i valori hash delle strutture venivano calcolati in modo diverso, portando alla perdita di disponibilità dei dati.
Storia
Quando memorizzavano un dizionario con una chiave complessa, si dimenticarono di implementare Equatable. Risultato: elementi con parametri identici venivano considerati chiavi diverse, creando duplicati ed errori nella ricerca nel dizionario.