#ios #swift #uitableview
#iOS #swift #uitableview
Вопрос:
У меня есть код заполнения строки UITableView в Swift следующим образом. Проблема во втором разделе, номер строки 2 присутствует условно. Если флаг имеет значение false, то все последующие строки сдвигаются на одну ячейку вверх, поэтому строка 3 становится строкой 2. Мне интересно, можно ли удобно указать это в операторе Swift switch, кроме метода грубой силы, где я пишу 2 оператора switch на основе флага true или false?
switch indexPath.section {
case 0:
cell.leftLabel.text = "Row 0";
case 1:
switch indexPath.row {
case 0:
cell.leftLabel.text = "Setting1"
case 1:
cell.leftLabel.text = "Setting2"
case 2:
/* Conditionally present row */
if flag {
cell.leftLabel.text = "Setting3"
}
case 3:
cell.leftLabel.text = "Setting4"
...
}
Комментарии:
1. Разве вы не можете иметь массив и добавлять / удалять элемент в позиции флага? Сколько элементов у вас всего?
2. Да, было намного лучше сделать массив настроек enum и управлять им. Удобнее, чем жесткое кодирование. Теперь я могу включить тип перечисления, а не indexpath.row
Ответ №1:
Я не совсем уверен в целом варианте использования, но вот некоторые улучшения, которые вы можете сделать, чтобы упростить эту задачу switch case
.
- Во-первых, вы можете использовать кортеж на основе
switch
forrow
иsection
обоих одновременно. - Во-вторых, используйте логический оператор вместе со случаями, что делает все это сравнение более доступным и удаляет ваши вложенные структуры if / else и casing .
Что-то подобное поможет вам в дальнейшем,
switch (indexPath.section, indexPath.row) {
case (0, _):
cell.leftLabel.text = "Row 0"
case (1, 0):
cell.leftLabel.text = "Setting1"
case (1, 1):
cell.leftLabel.text = "Setting2"
case (1, 2) where flag:
cell.leftLabel.text = "Setting3"
case (1, 2): // no flag here
cell.leftLabel.text = "Setting3 without flag"
case (1, 3):
cell.leftLabel.text = "Setting4"
...
}