Почему источники данных Diffable по-разному относятся к типам классов и структур?IOS

Программируем под IOS
Ответить
Anonymous
 Почему источники данных Diffable по-разному относятся к типам классов и структур?

Сообщение Anonymous »

Для источников данных Diffable требуется указатьsectionIdentifierType и ItemIdentifierType, и эти типы должны соответствовать Hashable
Предположительно, они должны соответствовать 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)
}
}
Если IntWrapper является структурой, табличное представление ничего не делает при вызове apply() ( по сути загружает одни и те же данные) Для меня это ожидаемое поведение.
Если IntWrapper является классом, представление таблицы перезагружается при вызове apply() . Кроме того, функции hash() и == даже НЕ вызываются.
Я не думаю, что на этот вопрос можно ответить, если у кого-то нет доступа к источнику (подсказка, подсказка ) или если я не допустил какую-то ошибку в своем примере.

Подробнее здесь: https://stackoverflow.com/questions/673 ... ifferently
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»