Gostaria de tirar uma dúvida, tenho me deparado com vários projetos aplicando models que herdam o protocolo equatable. E no curso é utilizado o firstIndex no momento de dar um unselect na tableView do cadastro de novo item. No meu caso acompanhei o curso implementando as funcionalidades seguindo um contexto um pouco diferente, porém com as mesmas funcionalidades.
extension PersonDetailsViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let cell = tableView.cellForRow(at: indexPath) else { return }
let clickedItemRow = indexPath.row
if cell.accessoryType == .none {
cell.accessoryType = .checkmark
selectedCourses.append(courses[clickedItemRow])
} else {
cell.accessoryType = .none
let course = courses[indexPath.row]
if let position = selectedCourses.firstIndex(of: course) {
selectedCourses.remove(at: position)
}
}
}
}
o que tenho visto com bastante frequência normalmente seria neste formato:
extension PersonDetailsViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let cell = tableView.cellForRow(at: indexPath) else { return }
let clickedItemRow = indexPath.row
if cell.accessoryType == .none {
cell.accessoryType = .checkmark
selectedCourses.append(courses[clickedItemRow])
} else {
cell.accessoryType = .none
let course = courses[indexPath.row]
if let position = selectedCourses.index(of: course) {
selectedCourses.remove(at: position)
}
}
}
}
e utilizando este index, é necessário haver a implementação do protocolo equatable no model.
func ==(lhs: Item, rhs: Item) -> Bool { ... }
Muitos fóruns dizem que é uma boa prática a implementação deste protocolo, mas no nosso caso não vi esta necessidade. Saberiam me informar se ainda é uma boa prática? E em que casos é adequado aplica-lo, pois isto não ficou tão claro pra mim.