ПрограммированиеSwift-разработчик

Как работает pattern matching для ranges (диапазонов) в Swift и какие особенности нужно учитывать при реализации сравнения с помощью switch?

Проходите собеседования с ИИ помощником Hintsage

Ответ

В Swift range matching часто используется в switch-case для сравнения значений с диапазонами. Для этого применяются операторы ..< (half-open range) и ... (closed range):

let score = 76 switch score { case 0..<60: print("Неудовлетворительно") case 60..<80: print("Удовлетворительно") case 80...100: print("Отлично") default: print("Некорректное значение") }

Особенности:

  • Диапазоны должны быть возрастающими: от меньшего к большему (иначе range будет пустой).
  • matching будет успешным, если значение лежит внутри диапазона.
  • Так как диапазоны — это структуры, их можно использовать для сопоставления с любыми Comparable типами.

Вопрос с подвохом

Что произойдет, если в switch использовать диапазон с верхней границей, не включающей значение (например, 0..<5), и переменная равна 5?

Часто отвечают, что такой case сработает, но это неверно: оператор ..< не включает верхнюю границу. Пример:

let value = 5 switch value { case 0..<5: print("0-4") case 5: print("пять") default: print("другое") } // Выведет: "пять"

Примеры реальных ошибок из-за незнания тонкостей темы


История

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


История

В приложении использовался switch-case с диапазонами, где одно из значений не вошло ни в один range из-за неправильного использования оператора (например, 0...10 и 11...20 — а значение 10.5 не попало никуда). Баг был обнаружен только на проде.


История

В коде сервиса сравнивали даты через range matching, используя half-open range неправильно: конечная дата не включалась, в результате отсеивались корректные интервалы, приводя к невозможности бронирования даты на последний допустимый день.