ChangeNet - assez génial petit projet
- Joel Levin
Il s'agit d'une tentative de mise en œuvre de la solution décrite dans l'article de Dave DeLong, de modifier les étapes de distance et de modifier.
A Changeset décrit les modifications minimales nécessaires pour passer d'une Collection d'éléments Equatable à un autre.
Il a été écrit principalement pour être utilisé en conjonction avec les sources de données UITableView et UICollectionView en détectant des ajouts, des suppressions, des substitutions et des mouvements entre les deux ensembles de données. Mais il peut également être utilisé pour calculer des changements plus généraux entre deux ensembles de données.
Le code suivant calcule les modifications minimales de l'exemple canonique, en passant des collections String «Kitten» à «assis»:
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 6L'affirmation suivante réussirait alors:
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 ) Si vous ne voulez pas la surcharge de Changeset elle-même, qui stocke également les collections source et cible, vous pouvez appeler directement edits (ici avec des exemples de données du guide de programmation de la vue de la table d'Apple pour 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]Notez que ChangeSet utilise des décalages, pas des indices, pour se référer aux éléments des collections. Cela est principalement dû au fait que les collections Swift ne sont pas garanties d'utiliser des indices entiers basés sur zéro. Voir la discussion dans le numéro 37 pour plus de détails.
Les valeurs de décalage peuvent être utilisées directement dans les blocs d'animation de beginUpdates / endUpdates sur UITableView et performBatchUpdates sur UICollectionView en ce que Changeset suit les principes expliqués sous l'insertion par lots, la suppression et le rechargement des lignes et des sections du guide d'Apple.
En bref; Tout d'abord, toutes les suppressions et substitutions sont effectuées, par rapport à la collection Source, par rapport à la collection résultante, les insertions. Une décision n'est qu'une suppression suivie d'une insertion.
Dans le cadre iOS, deux extensions de commodité (une sur UITableView et une sur UICollectionView ) ont été incluses pour faire des mises à jour de la vue de table / collection animées. Appelez simplement update , comme ceci:
tableView . update ( with : changeset . edits ) Par défaut, A Changeset utilise == pour comparer les éléments, mais vous pouvez écrire votre propre comparateur, illustré ci-dessous, où l'occurrence d'un «A» déclenche toujours un changement:
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 )En conséquence, l'ensemble de change consistera en une substitution du «A» (à un autre «A»):
let expectedEdits : [ Changeset < String > . Edit ] = [ Changeset . Edit ( operation : . substitution , value : " a " , destination : 0 ) ]
assert ( changeset . edits == expectedEdits ) Une utilisation possible de ceci est lorsqu'une cellule dans UITableView ou UICollectionView ne devrait pas animer lorsqu'elle change.
Le projet Xcode contient également une cible pour illustrer l'utilisation dans une application:

Cela utilise les extensions mentionnées ci-dessus pour animer les transitions basées sur les modifications d'un Changeset .
Ce projet est disponible sous la licence MIT.
Copyright © 2015-18, Joachim Bondo. Voir le fichier de licence.