web-dev-qa-db-fra.com

Conforme au protocole Hashable?

J'essaye de faire un dictionnaire avec la clé comme structure que j'ai créée et la valeur comme un tableau d'Ints. Cependant, je continue à avoir l'erreur: Type 'dateStruct' does not conform to protocol 'Hashable'. Je suis à peu près sûr d'avoir mis en œuvre les méthodes nécessaires, mais pour une raison quelconque, cela ne fonctionne toujours pas. Voici ma structure avec les protocoles implémentés:

struct dateStruct {
    var year: Int
    var month: Int
    var day: Int

    var hashValue: Int {
        return (year+month+day).hashValue
    }

    static func == (lhs: dateStruct, rhs: dateStruct) -> Bool {
        return lhs.hashValue == rhs.hashValue
    }

    static func < (lhs: dateStruct, rhs: dateStruct) -> Bool {
        if (lhs.year < rhs.year) {
            return true
        } else if (lhs.year > rhs.year) {
            return false
        } else {
            if (lhs.month < rhs.month) {
                return true
            } else if (lhs.month > rhs.month) {
                return false
            } else {
                if (lhs.day < rhs.day) {
                    return true
                } else {
                    return false
                }
            }
        }
    }
}

Quelqu'un peut-il m'expliquer s'il vous plaît pourquoi je reçois toujours l'erreur?

6
MarksCode

Vous manquez la déclaration:

struct dateStruct: Hashable {

BTW - les noms de structure et de classe doivent commencer par des lettres majuscules.

Et votre fonction == est incorrecte. Vous devriez comparer les trois propriétés.

static func == (lhs: dateStruct, rhs: dateStruct) -> Bool {
    return lhs.year == rhs.year && lhs.month == rhs.month && lhs.day == rhs.day
}

Il est possible que deux valeurs différentes aient la même valeur de hachage.

18
rmaddy

Vous n'avez pas spécifié le protocole Hashable lors de la définition de struct: struct dateStruct: Hashable {...

Le code suivant provient de votre exemple et s’exécute sur un terrain de jeu. Veuillez noter que votre opérateur == a été modifié ici :

import Foundation

struct dateStruct: Hashable {
    var year: Int
    var month: Int
    var day: Int

    var hashValue: Int {
        return (year+month+day).hashValue
    }

    static func == (lhs: dateStruct, rhs: dateStruct) -> Bool {
        return lhs.year == rhs.year && lhs.month == rhs.month && lhs.day == rhs.day
    }

    static func < (lhs: dateStruct, rhs: dateStruct) -> Bool {
        if (lhs.year < rhs.year) {
            return true
        } else if (lhs.year > rhs.year) {
            return false
        } else {
            if (lhs.month < rhs.month) {
                return true
            } else if (lhs.month > rhs.month) {
                return false
            } else {
                if (lhs.day < rhs.day) {
                    return true
                } else {
                    return false
                }
            }
        }
    }
}

var d0 = dateStruct(year: 2017, month: 2, day: 21)
var d1 = dateStruct(year: 2017, month: 2, day: 21)

var dates = [dateStruct:Int]()
dates[d0] = 23
dates[d1] = 49

print(dates)

print(d0 == d1) // true

d0.year = 2018

print(d0 == d1) // false
1
nbloqs