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?
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.
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