То, что вы, похоже, создаете, - это механизм для автоматизации изменений табличного представления при изменении данных. Очень распространенный. Я настоятельно рекомендую взглянуть на ListDiff для полезной отправной точки при расчете изменений. (В моем собственном коде я использую переписанную версию ListDiff, поэтому мои примеры здесь не проверены, но они должны быть очень близки.)
Цель состоит в том, чтобы создать набор операций обновления (скопированных из примера ListDiff):
import ListDiff
extension Int : Diffable {
public var diffIdentifier: AnyHashable {
return self
}
}
let o = [0, 1, 2]
let n = [2, 1, 3]
let result = List.diffing(oldArray: o, newArray: n)
// result.hasChanges == true
// result.deletes == IndexSet(integer: 0)
// result.inserts == IndexSet(integer: 2)
// result.moves == [List.MoveIndex(from: 2, to: 0), List.MoveIndex(from: 1, to: 1)]
// result.changeCount == 4
Здесь важно то, что у вас есть ряд операций удаления, вставки и перемещения. Вы можете применить их к табличному представлению с чем-то вроде этого:
extension UITableView {
func applyChanges(from changeset: Result, forSection section: Int = 0) {
beginUpdates()
let deletes = changeset.deletes.map { IndexPath(row: $0, section: section) }
deleteRows(at: deletes, with: .bottom)
let inserts = changeset.deletes.map { IndexPath(row: $0, section: section) }
insertRows(at: inserts, with: .none)
for move in changeset.moves {
guard !changeset.deletes.contains(move.from) else { continue }
moveRow(at: IndexPath(row: move.from, section: section),
to: IndexPath(row: move.to, section: section))
}
endUpdates()
}
}
Ключевым моментом здесь является то, что для анимации вам нужны только пути индекса. Вам на самом деле не нужны данные. Так что вычисляйте пути индекса и передавайте их. Дженерики не нужны.