es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La mejor práctica aquí sería hacer que el protocolo RowViewModel se adapte a Equatable. Esto permitiría comparar dos instancias del protocolo y determinar si son iguales o no. Luego, se pueden usar los métodos filter y compactMap para calcular la delta entre las listas antiguas y nuevas.

    Por ejemplo, se podría implementar el protocolo Equatable de la siguiente manera:

    extension RowViewModel: Equatable {
        static func == (lhs: RowViewModel, rhs: RowViewModel) -> Bool {
            // Implementar la lógica de comparación aquí
        }
    }
    

Comments are closed.