Pattern matching — фундаментальная часть языка Swift, позволяющая безопасно и элегантно обрабатывать различные варианты enum. Этот подход пришёл из функциональных языков, где сопоставление с образцом позволяет компактно обрабатывать разные кейсы, избегая длинных цепочек if-else. В Swift pattern matching для enum реализуется главным образом с помощью switch, где каждый case обрабатывается отдельно.
Проблема возникает, когда не реализованы все кейсы, либо выбран default, который потенциально "скрывает" неучтённые случаи. Это может привести к ошибкам времени исполнения при добавлении новых случаев в enum.
Решение — явно перебирать все варианты enum в switch, избегая default (если это возможно). Такой подход гарантирует, что при изменении enum компилятор не пропустит необработанные случаи.
Пример кода:
enum NetworkStatus { case connected case disconnected case connecting } func handle(status: NetworkStatus) { switch status { case .connected: print("Сеть подключена") case .disconnected: print("Сеть отключена") case .connecting: print("Соединение...") } }
Ключевые особенности:
1. Можно ли для enum без associated values использовать выражения if case?
Да, можно. Это позволяет кратко проверять конкретный case.
if case .connected = status { print("Сеть подключена") }
2. Обязательно ли реализовывать default, если в switch используются все case?
Нет, если реализованы все варианты, default не требуется. Лучше избегать default — так компилятор просигнализирует о добавлении новых case.
3. Можно ли использовать fallthrough внутри switch с enum?
Да, возможно, но крайне не рекомендуется, так как fallthrough не учитывает семантику case и может привести к логическим ошибкам.
В enum NetworkStatus добавлен новый case .noSignal, но в существующем switch есть default, поэтому ошибка обнаруживается только на рантайме, когда статус не обрабатывается корректно.
Плюсы:
Минусы:
Все case обработаны явно. Компилятор сообщает о необходимости доработки switch сразу при добавлении нового case.
Плюсы:
Минусы: