В Swift конструкция switch поддерживает расширенный pattern matching: вы можете использовать where для добавления условий к отдельным case. Это позволяет реализовать сложную бизнес-логику и фильтрацию.
Пример:
enum Person { case student(score: Int) case teacher(specialty: String) } let people = [Person.student(score: 95), Person.teacher(specialty: "Math"), Person.student(score: 65)] for person in people { switch person { case .student(let score) where score > 90: print("Отличник с результатом \(score)") case .teacher(let specialty): print("Учитель предмета: \(specialty)") default: print("Другой случай") } }
Использование where повышает читаемость и избегает дублирования кода, но слишком сложные условия могут ухудшить поддержку, а pattern matching с ассоциированными значениями требует чёткого контроля порядка case-ов.
Вопрос: "Обязательно ли при pattern matching с where внутри switch вызывать переменные с уникальными именами в каждом case?"
Ответ: Нет, но это рекомендуется во избежание путаницы. Если использовать одинаковые имена переменных в разных case, контекст ограничится соответствующим case, но одинаковое имя может мешать читаемости и сопровождению кода.
Пример:
switch value { case .status(let code) where code == 200: print("OK") case .status(let code) where code == 404: print("Not found")
История 1
В банковском приложении была секция анализа статусов с несколькими where-условиями. Из-за пропущенного break и неверного порядка case появлялась ситуация, где не обрабатывался специфический случай, и пользователи не видели полноценного статуса по операциям. Ошибка была обнаружена только при полевом тестировании.
История 2
В системе авторизации разработчик использовал одинаковые названия переменных в разных case-ах, что привело к путанице и багу: во втором случае пытались использовать переменную, определённую в другом case. Сборка работала, но некорректно в отдельных сценариях.
История 3
В сложном паттерн-матчинге с where не учли, что default не обработает часть комбинаций ассоциированного enum, из-за чего приложение падало с ошибкой pattern matching failed. Проблема была замечена только при интеграции новых типов данных в будущем.