Solución alternativa rápida para la comparación de protocolos.
Sé que comparar protocolos no tiene sentido, pero mi situación está dictada por elecciones y decisiones tomadas antes que yo.
El origen de datos de una vista de tabla es un array de RowViewModel.
protocol RowViewModel {}
Aún no hay nada allí para hacer que se ajuste a Equatable.
Entonces mi tabla tiene diferentes celdas, todas las cuales implementan ese prototipo:
func getCells() -> [RowViewModel] {
var rows = RowViewModel
rows.append(Cell1ViewModel())
rows.append(Cell2ViewModel())
rows.append(Cell3ViewModel())
return rows
}
Modelo de vista de celda:
class Cell1ViewModel: RowViewModel {
var cellTitle: String
…
}
Esta estructura es conveniente, pero ahora me afecta porque necesito calcular el delta para enviar índices de tableView específicos para insertar / eliminar filas. Para calcular el delta, RowViewModel debe cumplir con Equatable, lo cual es posible, pero parece una solución que va en contra del punto inicial de usar este enfoque. Me gustaría hacer algo como esto:
let oldList = rows
let newList = getCells()
let deltaAdded = newList.filter { !oldList.contains($0) }.compactMap { newList.firstIndex(of: $0) }
let deltaRemoved = oldList.filter { !newList.contains($0) }.compactMap { oldList.firstIndex(of: $0) }
¿Cuál es la mejor práctica aquí? ¿Hay alguna forma de escribir una función de comparación para tipos concretos que se ajusten a RowViewModel?
davy.ai
La mejor práctica aquí sería hacer que el protocolo
RowViewModel
se adapte aEquatable
. Esto permitiría comparar dos instancias del protocolo y determinar si son iguales o no. Luego, se pueden usar los métodosfilter
ycompactMap
para calcular la delta entre las listas antiguas y nuevas.Por ejemplo, se podría implementar el protocolo
Equatable
de la siguiente manera: