UITableViewDiffableDataSource и UICollectionViewDiffableDataSource работают по-разному, когда используется класс vs структура

Заметил при использовании UITableViewDiffableDataSource / UICollectionViewDiffableDataSource, ItemIdentifierType

когда используешь

var managedDataSource: UITableViewDiffableDataSource<String, StringCellObject>!

class StringCellObject: Hashable {

    let value: String

    func hash(into hasher: inout Hasher) {
        hasher.combine(value)
    }

    static func == (lhs: StringCellObject, rhs: StringCellObject) -> Bool {
        return lhs.value == rhs.value
    }

    init(value: String) {
        self.value = value
    }

}

когда StringCellObject является классом, функции Hashable даже не вызываются, а объекты всегда обрабатываются как измененные (даже значение одинаковое)

когда я меняю класс на структуру

struct StringCellObject: Hashable {

я получаю правильное поведение

Почему происходит изменение поведения и как добиться ожидаемого поведения при использовании классов?

1 ответ

Я думаю, вам нужно реализовать метод Hashable, как показано ниже.

      class Item: Hashable {
    
    static func == (lhs: Item, rhs: Item) -> Bool {
        lhs.id == rhs.id
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }
    
    let id = UUID()
}
Другие вопросы по тегам