В 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("Некорректное значение") }
Особенности:
Что произойдет, если в 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 неправильно: конечная дата не включалась, в результате отсеивались корректные интервалы, приводя к невозможности бронирования даты на последний допустимый день.