У меня возникла следующая проблема (это просто предупреждение) с моим проектом iOS.
Hashable.hashValue устарел как требование протокола; согласовать тип ActiveType с Hashable, реализовав вместо этого hash (into :)
- Xcode 10.2
- Swift 5
Исходный код:
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
}
}
}
Есть лучшее решение? Само предупреждение предлагает мне реализовать хэш (в :), но я не знаю, как?
Ссылка: ActiveLabel
Hashable
соответствие для вашегоenum
. Вам также не нужно явно указыватьEquatable
соответствие, посколькуHashable
наследуется отEquatable
, поэтому, когда вы объявляетеHashable
соответствие,Equatable
методы синтезируются для вас. - person Dávid Pásztor   schedule 28.03.2019Hashable
отошел от того, чтобы просить соответствующие типы оhashValue: Int
, описывающем самих себя, к тому, чтобы просить их принятьHasher
и смешать себя с ним (путем смешивания в своих полях). Раньше люди испытывали трудности с получением хороших хеш-значений для объектов с несколькими полями, часто прибегая к хакам, таким как XOR для всех элементов (a ^ b ^ c
) или, что еще хуже, взяв строковое значение строки, которая объединяет элементы ("\(a)-\(b)-\(c)".hashValue
). Теперь вместо этого вы просто указываете хешеру, что хешировать, и он использует соответствующий алгоритм хеширования, чтобы сделать это от вашего имени. - person Alexander   schedule 24.11.2019