J'ai rencontré le problème suivant (c'est juste un avertissement) avec mon projet iOS.
'Hashable.hashValue' est déconseillé en tant qu'exigence de protocole; conformez le type 'ActiveType' à 'Hashable' en implémentant 'hash (into :)' à la place
Code source:
public enum ActiveType {
case mention
case hashtag
case url
case custom(pattern: String)
var pattern: String {
switch self {
case .mention: return RegexParser.mentionPattern
case .hashtag: return RegexParser.hashtagPattern
case .url: return RegexParser.urlPattern
case .custom(let regex): return regex
}
}
}
extension ActiveType: Hashable, Equatable {
public var hashValue: Int {
switch self {
case .mention: return -1
case .hashtag: return -2
case .url: return -3
case .custom(let regex): return regex.hashValue
}
}
}
Une meilleure solution? L'avertissement lui-même me suggérant d'implémenter 'hash (into :)' mais je ne sais pas, comment?
Référence: ActiveLabel
Comme l'indique l'avertissement, vous devez maintenant implémenter la fonction hash(into:)
à la place.
func hash(into hasher: inout Hasher) {
switch self {
case .mention: hasher.combine(-1)
case .hashtag: hasher.combine(-2)
case .url: hasher.combine(-3)
case .custom(let regex): hasher.combine(regex) // assuming regex is a string, that already conforms to hashable
}
}
CONSEIL: vous n'avez pas besoin de rendre l'énumération explicitement conforme à Equatable
car Hashable
l'étend.