Sobes.tech
Middle

Τι πρέπει να γίνει ώστε η δομή χρήστη να γίνει κλειδί στο λεξικό;

sobes.tech AI

Απάντηση από AI

Απαιτείται η υλοποίηση του πρωτοκόλλου Hashable.

Το πρωτόκολλο Hashable κληρονομεί από το Equatable.

  • Equatable: Απαιτεί την υλοποίηση του τελεστή ισότητας == για τη σύγκριση δύο στιγμιότυπων μιας δομής.
  • Hashable: Απαιτεί την υλοποίηση της ιδιότητας hash(into:), η οποία υπολογίζει την τιμή κατακερματισμού για ένα στιγμιότυπο της δομής.

Παράδειγμα υλοποίησης:

struct Coordinate: Hashable {
    let x: Int
    let y: Int

    // MARK: - Equatable
    static func == (lhs: Coordinate, rhs: Coordinate) -> Bool {
        return lhs.x == rhs.x && lhs.y == rhs.y
    }

    // MARK: - Hashable
    func hash(into hasher: inout Hasher) {
        hasher.combine(x)
        hasher.combine(y)
    }
}

// Χρήση σε λεξικό
let coordinatesDictionary: [Coordinate: String] = [
    Coordinate(x: 0, y: 0): "Origin",
    Coordinate(x: 1, y: 1): "Point (1,1)"
]

print(coordinatesDictionary[Coordinate(x: 0, y: 0)]!)

Το Hasher χρησιμοποιείται για τη δημιουργία της τιμής κατακερματισμού. Η μέθοδος combine δέχεται διάφορες τιμές που μπορούν να κατακερματιστούν και τις συνδυάζει για να δημιουργήσει το τελικό hash.