web-dev-qa-db-fra.com

Rendre la structure hashable?

J'essaie de créer un dictionnaire du type [petInfo : UIImage]() mais j'obtiens l'erreur Type 'petInfo' does not conform to protocol 'Hashable'. Ma structure petInfo est la suivante:

struct petInfo {
    var petName: String
    var dbName: String
}

Je veux donc en quelque sorte le rendre lavable mais aucun de ses composants n'est un entier qui est ce que le var hashValue: Int a besoin. Comment puis-je le rendre conforme au protocole si aucun de ses champs n'est un entier? Puis-je utiliser le dbName si je sais qu'il va être unique pour toutes les occurrences de cette structure?

30
MarksCode

Retournez simplement dbName.hashValue à partir de votre fonction hashValue. FYI - la valeur de hachage n'a pas besoin d'être unique. La condition est que deux objets équivalents doivent également avoir la même valeur de hachage.

struct PetInfo: Hashable {
    var petName: String
    var dbName: String

    var hashValue: Int {
        return dbName.hashValue
    }

    static func == (lhs: PetInfo, rhs: PetInfo) -> Bool {
        return lhs.dbName == rhs.dbName && lhs.petName == rhs.petName
    }
}
46
rmaddy

À partir de Swift 5 var hashValue:Int A été déconseillé au profit de func hash(into hasher: inout Hasher) (introduit dans Swift 4.2), donc pour mettre à jour la réponse donnée par @rmaddy:

func hash(into hasher: inout Hasher) {
    hasher.combine(dbName.hashValue)
}
1
ChrisH