Dictionary to asocjacyjny kontener w Swift, który przechowuje pary „klucz–wartość”. Klucze muszą implementować protokoły Hashable i Equatable, aby zapewnić unikalność i stały czas dostępu do elementów.
Cechy:
Hashable i Equatable są zaimplementowane.Przykład:
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
Czy Dictionary może przyjąć jako klucz typ zdefiniowany przez użytkownika, który nie implementuje Hashable?
— Niepoprawnie. Jeśli typ nie implementuje Hashable, nie może być używany jako klucz. Próba użycia spowoduje błąd kompilacji.
Przykład:
class Foo {} var dict: [Foo: Int] = [:] // Błąd: Foo nie implementuje Hashable
Historia
W projekcie przechowywano klucze Dictionary oparte na strukturach z tablicami wewnątrz. Struktura nie spełniała protokołu Hashable, przez co Dictionary nie działał. Rozwiązanie: zaimplementować własny hashValue, uwzględniając wszystkie pola, w tym tablice.
Historia
Używano klas podrzędnych NSObject jako kluczy, polegając na adresie obiektu. Po przepisaniu części kodu na struktury dane przestały się zgadzać: wartości haszowe struktur były obliczane w inny sposób, co prowadziło do utraty dostępności danych.
Historia
Podczas przechowywania słownika ze złożonym kluczem zapomniano zaimplementować Equatable. Rezultat — elementy o tych samych parametrach były traktowane jako różne klucze, co prowadziło do duplikatów i błędów podczas wyszukiwania w słowniku.