Sobes.tech
Junior

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

sobes.tech AI

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

Οι δομές ή οι κλάσεις πρέπει να είναι hashable. Για μια δομή ή κλάση που περιέχει μόνο hashable τύπους (π.χ., Int, String, Bool), ο μεταγλωττιστής δημιουργεί αυτόματα την υλοποίηση του πρωτοκόλλου Hashable. Εάν η δομή ή η κλάση περιέχει μη-hashable τύπους ή απαιτεί ειδική λογική hashing, τότε:

  1. Πρέπει να υλοποιηθεί το πρωτόκολλο Hashable.
  2. Στη μέθοδο hash(into:), τα hashable συστατικά της στιγμής προστίθενται στον παρεχόμενο hasher.
struct User: Hashable {
    let id: UUID // Το UUID είναι hashable από προεπιλογή
    let name: String // Το String είναι hashable από προεπιλογή

    // Αυτοπαραγόμενο αν όλες οι ιδιότητες είναι hashable
    // func hash(into hasher: inout Hasher) {
    //     hasher.combine(id)
    //     hasher.combine(name)
    // }
}

class Settings: Hashable {
    var difficulty: Int
    var volume: Float

    init(difficulty: Int, volume: Float) {
        self.difficulty = difficulty
        self.volume = volume
    }

    // Χειροκίνητη υλοποίηση για την κλάση
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Απαιτείται επίσης η υλοποίηση του `Equatable`
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

// Παράδειγμα χρήσης
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]

Επίσης, πρέπει να υλοποιηθεί το πρωτόκολλο Equatable, καθώς το Hashable κληρονομεί από αυτό. Ο μεταγλωττιστής δημιουργεί αυτόματα την υλοποίηση του Equatable για δομές των οποίων οι ιδιότητες είναι επίσης Equatable. Για κλάσεις ή δομές με ιδιότητες που δεν είναι Equatable (ή για ειδική λογική σύγκρισης), απαιτείται χειροκίνητη υλοποίηση του ==.