Предположительно, они должны соответствовать Hashable< /code>, чтобы источник данных мог выполнять свои различия.
Так почему же он ведет себя по-разному в зависимости от того, является ли тип идентификатора классом или структурой, даже если функции == и хеш-функции тот такой же? Или даже функция === переопределяется для классов, и она больше похожа на тип значения?
Пример:
Код: Выделить всё
import UIKit
public class DebugViewController: UIViewController {
typealias SectionType = IntWrapper
typealias ItemType = IntWrapper
public class IntWrapper: Hashable {
public static func == (lhs: DebugViewController.IntWrapper, rhs: DebugViewController.IntWrapper) -> Bool {
lhs.number == rhs.number
}
public static func === (lhs: DebugViewController.IntWrapper, rhs: DebugViewController.IntWrapper) -> Bool {
lhs.number == rhs.number
}
public func hash(into hasher: inout Hasher) {
hasher.combine(number)
}
var number: Int
init(number: Int) {
self.number = number
}
}
private var dataSource: UITableViewDiffableDataSource!
@IBOutlet var tableView: UITableView!
public override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "DefaultCell")
dataSource = UITableViewDiffableDataSource(tableView: tableView) { (tableView, indexPath, item) -> UITableViewCell? in
let cell = tableView.dequeueReusableCell(withIdentifier: "DefaultCell")!
cell.textLabel?.text = "\(item.number)"
return cell
}
apply()
}
@IBAction func buttonTapped(_ sender: Any) {
apply()
}
func apply() {
var snapshot = NSDiffableDataSourceSnapshot()
let sections = [IntWrapper(number: 0)]
let items = [IntWrapper(number: 1)]
snapshot.appendSections(sections)
sections.forEach { snapshot.appendItems( items, toSection: $0) }
dataSource.apply(snapshot, animatingDifferences: true)
}
}
Код: Выделить всё
apply()Если IntWrapper является классом, представление таблицы перезагружается при вызове apply() . Кроме того, функции hash() и == даже НЕ вызываются.
Я не думаю, что на этот вопрос можно ответить, если у кого-то нет доступа к источнику (подсказка, подсказка ) или если я не допустил какую-то ошибку в своем примере.
Подробнее здесь: https://stackoverflow.com/questions/673 ... ifferently
Мобильная версия