CAMPOSTET - Pequeño proyecto bastante impresionante
- Joel Levin
Este es un intento de implementar la solución descrita en el artículo de Dave DeLong, la distancia de edición y los pasos de edición.
Un Changeset describe las ediciones mínimas requeridas para pasar de una Collection de elementos Equatable a otro.
Se ha escrito principalmente para ser utilizado junto con las fuentes de datos UICollectionView UITableView detectar adiciones, deleciones, sustituciones y movimientos entre los dos conjuntos de datos. Pero también se puede usar para calcular cambios más generales entre dos conjuntos de datos.
El siguiente código calcula las ediciones mínimas del ejemplo canónico, pasando de las colecciones String "gatito" a "sentarse":
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 6La siguiente afirmación tendrá éxito:
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 no desea la sobrecarga de Changeset en sí, que también almacena las colecciones de origen y destino, puede llamar a edits directamente (aquí con datos de ejemplo de la Guía de programación de la vista de tabla de Apple para 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]Tenga en cuenta que ChogingET usa compensaciones, no índices, para referirse a elementos en las colecciones. Esto se debe principalmente a que no se garantiza que las colecciones Swift usen índices enteros basados en cero. Vea la discusión en el número 37 para más detalles.
Los valores de desplazamiento se pueden usar directamente en los bloques de animación de beginUpdates / endUpdates en UITableView y performBatchUpdates en UICollectionView en que Changeset siguen los principios explicados en la inserción, eliminación y recarga de filas y secciones en la guía de Apple.
En breve; Primero, todas las deleciones y sustituciones se realizan, en relación con la colección de fuente, entonces, en relación con la colección resultante, las inserciones. Un movimiento es solo una eliminación seguida de una inserción.
En el marco de iOS, se han incluido dos extensiones de conveniencia (una en UITableView y otra en UICollectionView ) para hacer que las actualizaciones animadas de mesa/vista de colección sean muy fáciles. Solo llame a update , así:
tableView . update ( with : changeset . edits ) Por defecto, un Changeset usa == para comparar elementos, pero puede escribir su propio comparador, ilustrado a continuación, donde la ocurrencia de una "A" siempre desencadena un cambio:
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 )Como resultado, el conjunto de cambios consistirá en una sustitución de la "A" (a otra "A"):
let expectedEdits : [ Changeset < String > . Edit ] = [ Changeset . Edit ( operation : . substitution , value : " a " , destination : 0 ) ]
assert ( changeset . edits == expectedEdits ) Un uso posible de esto es cuando una celda en UITableView o UICollectionView no debería animar cuando cambia.
El proyecto XCode también contiene un objetivo para ilustrar el uso en una aplicación:

Esto utiliza las extensiones mencionadas anteriormente para animar las transiciones basadas en las ediciones de un Changeset .
Este proyecto está disponible bajo la licencia MIT.
Copyright © 2015-18, Joachim Bondo. Ver archivo de licencia.