Ответ
Да, в Swift оператор switch должен быть исчерпывающим (exhaustive) при работе с перечислениями (enum). Компилятор проверяет это и выдает ошибку, если не все кейсы обработаны.
Правила и исключения:
-
Обычный 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 не требуется, все кейсы обработаны } -
@unknown default: Используется дляenum, помеченных как@frozen(или стандартных библиотечных), которые не будут меняться в будущем, и для незамороженных (non-frozen) enum из фреймворков, которые могут получить новые кейсы в следующих версиях OS. Эта ветка обрабатывает любые потенциальные будущие кейсы, не нарушая исчерпывающую проверку компилятора.// Для non-frozen enum из фреймворка (например, UITableViewCell.CellStyle) switch cellStyle { case .default: // Обработка известных кейсов case .value1: case .value2: @unknown default: // Обрабатывает любые новые кейсы, добавленные в будущем break }
Почему это важно: Эта гарантия полноты обработки на этапе компиляции исключает целый класс ошибок времени выполнения, связанных с неучтенными состояниями данных.