Swift переключает условный номер и тег строк

#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 for row и 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"
        
     ...   
}