Änderungenset - ziemlich tolles kleines Projekt
- Joel Levin
Dies ist ein Versuch, die Lösung zu implementieren, die in Dave Delongs Artikel, die Distanz bearbeiten und die Schritte bearbeiten.
Ein Changeset beschreibt die minimalen Änderungen, die erforderlich sind, um von einer Collection Equatable Elemente zu einer anderen zu wechseln.
Es wurde hauptsächlich geschrieben, um in Verbindung mit Datenquellen UITableView und UICollectionView verwendet zu werden, indem Ergänzungen, Löschungen, Substitutionen und Bewegungen zwischen den beiden Datensätzen erfasst werden. Es kann aber auch verwendet werden, um allgemeinere Änderungen zwischen zwei Datensätzen zu berechnen.
Der folgende Code berechnet die minimalen Änderungen des kanonischen Beispiels, wobei die String „Kätzchen“ zu „sitzen“ werden:
let changeset = Changeset ( source : " kitten " , target : " sitting " )
print ( changeset )
// 'kitten' -> 'sitting':
// replace with s at offset 0
// replace with i at offset 4
// insert g at offset 6Die folgende Behauptung würde dann erfolgreich sein:
let edits = [
Changeset < String > . Edit ( operation : . substitution , value : " s " , destination : 0 ) ,
Changeset < String > . Edit ( operation : . substitution , value : " i " , destination : 4 ) ,
Changeset < String > . Edit ( operation : . insertion , value : " g " , destination : 6 ) ,
]
assert ( changeset . edits == edits ) Wenn Sie nicht möchten, dass der Overhead von Changeset selbst, der auch die Quell- und Zielsammlungen speichert, können Sie edits direkt aufrufen (hier mit Beispieldaten aus Apples Tabellenansicht -Programmierhandbuch für iOS):
let source = [ " Arizona " , " California " , " Delaware " , " New Jersey " , " Washington " ]
let target = [ " Alaska " , " Arizona " , " California " , " Georgia " , " New Jersey " , " Virginia " ]
let edits = Changeset . edits ( from : source , to : target )
print ( edits )
// [insert Alaska at offset 0, replace with Georgia at offset 2, replace with Virginia at offset 4]Beachten Sie, dass Änderungen SETTS -Offsets und nicht Indizes verwendet, um sich auf Elemente in den Sammlungen zu beziehen. Dies liegt hauptsächlich daran, dass Swift-Kollektionen nicht garantiert garantiert, dass sie auf Null-basierte Ganzzahlindizes sind. Weitere Informationen finden Sie in Ausgabe Nr. 37.
Die Offset -Werte können direkt in den Animationsblöcken von beginUpdates / endUpdates auf UITableView und performBatchUpdates auf UICollectionView verwendet werden. In diesem Changeset folgt die Prinzipien, die unter Batch -Insertion, Löschung und Nachladen von Zeilen und Abschnitten im Apple -Leitfaden erläutert werden.
Zusamenfassend; Zunächst werden alle Löschungen und Substitutionen im Vergleich zur Quellsammlung im Verhältnis zur resultierenden Sammlung und Einfügungen erstellt. Ein Schritt ist nur eine Löschung, gefolgt von einem Einfügen.
Im iOS -Framework wurden zwei Convenience -Erweiterungen (eine auf UITableView und eine auf UICollectionView ) enthalten, um animierte Tabellen-/Sammlungsansicht -Updates zum Kinderspiel zu erstellen. Rufen Sie einfach update so an:
tableView . update ( with : changeset . edits ) Standardmäßig verwendet ein Changeset == , um Elemente zu vergleichen, aber Sie können Ihren eigenen Komparator schreiben, der unten dargestellt wird, wobei das Auftreten eines „A“ immer eine Änderung auslöst:
let alwaysChangeA : ( Character , Character ) -> Bool = {
if $0 == " a " || $1 == " a " {
return false
} else {
return $0 == $1
}
}
let changeset = Changeset ( source : " ab " , target : " ab " , comparator : alwaysChangeA )Infolgedessen besteht der Änderungssatz aus einer Substitution des „A“ (durch ein anderes „A“):
let expectedEdits : [ Changeset < String > . Edit ] = [ Changeset . Edit ( operation : . substitution , value : " a " , destination : 0 ) ]
assert ( changeset . edits == expectedEdits ) Eine mögliche Verwendung davon ist, wenn eine Zelle in einem UITableView oder UICollectionView nicht animieren sollte, wenn sie sich ändern.
Das Xcode -Projekt enthält auch ein Ziel, um die Verwendung in einer App zu veranschaulichen:

Dies verwendet die oben genannten Erweiterungen, um Übergänge auf der Grundlage der Changeset einsetzt zu animieren.
Dieses Projekt ist im Rahmen der MIT -Lizenz verfügbar.
Copyright © 2015-18, Joachim Bondo. Siehe Lizenzdatei.