Я пытаюсь исправить старый учебник с сайта RayWenderlich, который больше не поддерживается. Предупреждение появляется в трех файлах, Chain.swift, Cookie.swift и Swap.swift из учебника «Как сделать игру похожей на Candy Crush с SpriteKit и Swift:»
Я в растерянности даже после изучения доступных ответов, которые появляются во многих местах. Я изо всех сил пытаюсь понять, что делает этот код, чтобы я мог это исправить. Я знаю, что это просто предупреждение, и я, вероятно, могу его проигнорировать, но игра также показывает X, где должны появляться пустые плитки, поэтому я подозреваю, что это может иметь какое-то отношение к этому?
Предупреждение следующее:
'Hashable.hashValue' is deprecated as a protocol requirement; conform type 'Chain' to 'Hashable' by implementing 'hash(into:)' instead
Пример файла
class Chain: Hashable, CustomStringConvertible {
var cookies: [Cookie] = []
var score = 0
enum ChainType: CustomStringConvertible {
case horizontal
case vertical
var description: String {
switch self {
case .horizontal: return "Horizontal"
case .vertical: return "Vertical"
}
}
}
var chainType: ChainType
init(chainType: ChainType) {
self.chainType = chainType
}
func add(cookie: Cookie) {
cookies.append(cookie)
}
func firstCookie() -> Cookie {
return cookies[0]
}
func lastCookie() -> Cookie {
return cookies[cookies.count - 1]
}
var length: Int {
return cookies.count
}
var description: String {
return "type:\(chainType) cookies:\(cookies)"
}
var hashValue: Int {
return cookies.reduce (0) { $0.hashValue ^ $1.hashValue }
}
static func ==(lhs: Chain, rhs: Chain) -> Bool {
return lhs.cookies == rhs.cookies
}
}
Hashable
отошел от того, чтобы просить соответствующие типы оhashValue: Int
, который описывает самих себя, к просьбе принятьHasher
и смешать себя с ним (путем смешивания в своих полях). Раньше люди испытывали трудности с получением хороших хеш-значений для объектов с несколькими полями, часто прибегая к хакерским приемам, таким как XOR для всех элементов (a ^ b ^ c
) или, что еще хуже, взяв строковое значение строки, которая объединяет элементы ("\(a)-\(b)-\(c)".hashValue
). Теперь вместо этого вы просто говорите хешеру, что хешировать, и он использует соответствующий алгоритм хеширования, чтобы сделать это от вашего имени. - person Alexander   schedule 24.11.2019