Junior
Τι πρέπει να κάνετε ώστε η δομή ή η κλάση χρήστη να γίνει κλειδί σε ένα λεξικό;
sobes.tech AI
Απάντηση από AI
Οι δομές ή οι κλάσεις πρέπει να είναι hashable. Για μια δομή ή κλάση που περιέχει μόνο hashable τύπους (π.χ., Int, String, Bool), ο μεταγλωττιστής δημιουργεί αυτόματα την υλοποίηση του πρωτοκόλλου Hashable. Εάν η δομή ή η κλάση περιέχει μη-hashable τύπους ή απαιτεί ειδική λογική hashing, τότε:
- Πρέπει να υλοποιηθεί το πρωτόκολλο
Hashable. - Στη μέθοδο
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 (ή για ειδική λογική σύγκρισης), απαιτείται χειροκίνητη υλοποίηση του ==.