#ios #swift
Вопрос:
У меня есть функция для ячейки представления таблицы, но у нее много обязанностей:
- форматирование данных (я делаю это с расширением для даты)
- настройка текста для надписей
- скрытие/отображение изображений хода выполнения (называемых параметрами) зависит от количества строк с расширением
- проверка, относится ли последняя сохраненная запись к сегодняшнему дню (если да, измените текстовые метки)
класс tableViewCell ниже
func setProgressParameteres(positive: Bool) { if positive { arrowProgress.image = UIImage(systemName: Images.arrowUp) arrowProgress.tintColor = .green weightProgress.textColor = .green } else { arrowProgress.image = UIImage(systemName: Images.arrowDown) arrowProgress.tintColor = .red weightProgress.textColor = .red } } func configureCell(tableViewData: [BodyWeightCalendarModel], indexPath: IndexPath) { //formatted retrieved date let formattedDateWithTime = tableViewData[indexPath.row].date.getFormattedDate(format: DateFormats.formatDayMonthTime) let formattedDate = tableViewData[indexPath.row].date.getFormattedDate(format: DateFormats.formatYearMonthDay) let weight = String(tableViewData[indexPath.row].weight) weightValue.text = "(weight) (weightUnit)" //Hide progress parameters if first row selected if indexPath.row == tableViewData.count - 1 { hideProgressParameters(bool: true) } else { let progressValue = tableViewData[indexPath.row].weight - tableViewData[indexPath.row 1].weight let progressValueString = String(format: "%.1f", progressValue) weightProgress.text = ("(progressValueString) kg") //Check if progression is on or - if progressValue > 0 { setProgressParameteres(positive: true) } else { setProgressParameteres(positive: false) } hideProgressParameters(bool: false) } // Check if last record is from today if formattedDate == todayDate { dayLabel.text = "Today" } else { dayLabel.text = formattedDateWithTime }
}
Интересно, какой лучший вариант сделать этот код чище? Создайте небольшую функцию и вызовите их все в configureCell или, может быть, создайте новый TableViewCellPresenter только для этой ячейки и передайте всю эту логику этому докладчику?
Комментарии:
1. Вы можете просто указать по крайней мере одну часть кода, указав своему форматору даты использовать относительное форматирование, тогда вы автоматически получите «сегодня», «вчера», «Воскресенье» и т. Д.
2. Кроме того, если этот код находится в вашей ячейке, он находится в неправильном месте. Ячейка не должна знать о своем номере строки, и вам не нужно передавать весь массив табличных данных. Создание расширения
Date
для форматирования дат с использованием DateFormatter также кажется чрезмерно сложным. Похоже, вы могли бы поместить большую часть этого кода в вычисляемые свойства объекта модели представления, который вы передаете в ячейку3. Вы также можете использовать мощные
Measurement
классы Swift для своих весов; Если вы создадите измерение веса, оно может быть автоматически отформатировано с учетом региональных особенностей (кг в метрических единицах измерения, фунты в имперских единицах измерения).4. Вопросы о коде, который работает, но который вы хотите улучшить, можно задать по адресу codereview.stackexchange.com
5. ДА. Ячейка-это представление. Ваш контроллер представления или модель представления должны передавать ему необходимые данные. Он не должен содержать никакой вычислительной логики. Конечно, это возможно , как вы уже сделали. Это просто вопрос стиля. Лично я бы не стал связывать данные ячейки и модели таким образом.