Метод Hashable == не обнаруживает разницу между двумя объектами swift
Я реализовал класс ниже:
class Table : Hashable {
var uid : Int
var timeRemaining : Int?
var currentPrice : Double?
var hashValue: Int {
return uid.hashValue
}
static func ==(lhs: Table, rhs: Table) -> Bool {
return lhs.uid == rhs.uid && lhs.timeRemaining == rhs.timeRemaining && lhs.currentPrice == rhs.currentPrice
}
init (uid: Int, timeRemaining: Int?, currentPrice: Double?) {
self.uid = uid
self.timeRemaining = timeRemaining
self.currentPrice = currentPrice
}
}
Я также определил массив объектов этого класса:
private var tables = [Table]()
Далее у меня есть следующий метод, который запускается каждую секунду:
func updateAuctions() {
let oldItems = tables
let newItems = oldItems
for table in newItems {
let oldPrice = table.currentPrice!
let timeRemaining = table.timeRemaining!
table.currentPrice = oldPrice + 0.50
table.timeRemaining = timeRemaining - 1
}
let changes = diff(old: oldItems, new: newItems)
collectionView.reload(changes: changes, section: 0) { (complete) in
if (complete) {
self.tables = newItems
}
}
}
Это использует платформу DeepDiff, описанную здесь: https://github.com/onmyway133/DeepDiff
Моя цель - обновить UICollectionView
с изменениями, внесенными в tables
массив, однако никаких изменений не обнаружено в рамках, хотя мой ==
Метод проверяет, что timeRemaining
а также currentPrice
матч.
1 ответ
let newItems = oldItems
Поскольку оба массива содержат экземпляры объектов, не будут ли они просто указывать на одни и те же объекты? Поэтому, когда вы перебираете newItems
и меняя значения, вы по сути меняете значения oldItems
тоже. Вы можете убедиться в этом, напечатав значения обоих массивов после for
петля.
Может быть, вы можете попробовать что-то похожее на следующее?
func updateAuctions() {
let oldItems = tables
let newItems = [Table]()
for item in oldItems {
newItems.append(Table(uid: item.uid, timeRemaining: item.timeRemaining! - 1, currentPrice: item.currentPrice! + 0.50))
}
let changes = diff(old: oldItems, new: newItems)
collectionView.reload(changes: changes, section: 0) { (complete) in
if (complete) {
self.tables = newItems
}
}
}