/** * Beispiel aus * * - Algorithmen und Datenstrukturen für Dummies * - von Andreas Gogol-Döring und Thomas Letschert * - Verlag Wiley-VCH; Oktober 2019 * - Kapitel 9, Mengen und ihre Speicherung * * @author A. Gogol-Döring, Th. Letschert */ import Foundation struct AuD_09_05_RabbitMutableObjectHash { /* * Die Speicherung von Objekte mit veränderlichen Attributen (Feldern) in Hashtabellen ist grundsätzlich * kritisch zu sehen. Wenn es sich nicht vermeiden lässt, dass es einen Unterschied zwischen ``das Selbe'' * und ``das Gleiche'' gibt, dann muss geklärt werden, ob equals die Identität oder die Gleichheit testet. * Nehmen wir das Kaninchen Egon, das im Laufe der Jahre erheblich an Lebenserfahrung und Gewicht gewonnen hat, * aber im Grund immer der Selbe geblieben ist, während es in einer veränderlichen und einer unveränderlichen * Hashtabelle steckt: */ struct Rabbit: Hashable { let name: String var weight: Int = 0 init(_ name: String, _ weight: Int) { self.name = name self.weight = weight } mutating func setWeight(newWeight: Int) { weight = newWeight } } /* Korrektur: Gewicht sind veränderlich => nicht relevant für Gleicheit und Hashcode */ struct Rabbit_C: Hashable { let name: String var weight: Int = 0 init(_ name: String, _ weight: Int) { self.name = name self.weight = weight } mutating func setWeight(newWeight: Int) { weight = newWeight } static func == (lhs: Rabbit_C, rhs: Rabbit_C) -> Bool { lhs.name == rhs.name } func hash(into hasher: inout Hasher) { hasher.combine(name) } } static var egon = Rabbit("Egon", 3) static var egon_C = Rabbit_C("Egon", 3) static var rabbits = Swift.Set() static var rabbits_C = Swift.Set() static func run() { rabbits.insert(egon) rabbits_C.insert(egon_C) print(rabbits.contains(egon)) // true print(rabbits_C.contains(egon_C)) // true egon.setWeight(newWeight: egon.weight+5) egon_C.setWeight(newWeight: egon_C.weight+5) print(rabbits.contains(egon)) // false print(rabbits_C.contains(egon_C)) // true } }