Метод Hashable == не обнаруживает разницу между двумя объектами swift - PullRequest
0 голосов
/ 23 февраля 2019

Я реализовал класс ниже:

    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 Ответ

0 голосов
/ 23 февраля 2019

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