Должен ли оператор switch в Swift обрабатывать все кейсы enum?

«Должен ли оператор switch в Swift обрабатывать все кейсы enum?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в Swift оператор switch должен быть исчерпывающим (exhaustive) при работе с перечислениями (enum). Компилятор проверяет это и выдает ошибку, если не все кейсы обработаны.

Правила и исключения:

  1. Обычный enum: Необходимо явно перечислить все кейсы или добавить ветку default.

    enum Direction {
        case north, south, east, west
    }
    
    let dir = Direction.north
    switch dir {
        case .north: print("North")
        case .south: print("South")
        case .east: print("East")
        case .west: print("West")
        // default не требуется, все кейсы обработаны
    }
  2. @unknown default: Используется для enum, помеченных как @frozen (или стандартных библиотечных), которые не будут меняться в будущем, и для незамороженных (non-frozen) enum из фреймворков, которые могут получить новые кейсы в следующих версиях OS. Эта ветка обрабатывает любые потенциальные будущие кейсы, не нарушая исчерпывающую проверку компилятора.

    // Для non-frozen enum из фреймворка (например, UITableViewCell.CellStyle)
    switch cellStyle {
        case .default: // Обработка известных кейсов
        case .value1:
        case .value2:
        @unknown default: // Обрабатывает любые новые кейсы, добавленные в будущем
            break
    }

Почему это важно: Эта гарантия полноты обработки на этапе компиляции исключает целый класс ошибок времени выполнения, связанных с неучтенными состояниями данных.