Sobes.tech
Junior — Middle

Come determina Swift la differenza tra due oggetti in caso di collisione dell'hash?

sobes.tech AI

Risposta dell'AI

In Swift, il metodo isEqual(_:) viene utilizzato per confrontare oggetti e risolvere collisioni di hash. Quando due oggetti hanno lo stesso hash (collisione), il sistema chiama anche questo metodo per verificare se gli oggetti sono effettivamente uguali.

Processo:

  1. Viene calcolato l'hash dell'oggetto tramite hash(into:).
  2. Se due oggetti hanno lo stesso hash, viene chiamato isEqual(_:) per un confronto preciso.
  3. Se isEqual(_:) restituisce true, gli oggetti sono considerati uguali, altrimenti diversi.

Questo permette di lavorare correttamente con collezioni come Set o chiavi nei dizionari, anche in caso di collisioni di hash.

Esempio di implementazione:

class Person: Hashable {
    let id: Int
    let name: String

    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }

    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.id == rhs.id && lhs.name == rhs.name
    }
}

Qui, se due oggetti Person hanno lo stesso hash (ad esempio, lo stesso id), verrà chiamato l'operatore == per il confronto finale.