Я столкнулся со странным поведением с функцией String.removeSubrange.Вот что говорится в документации:
Удаляет символы в заданном диапазоне.
Параметры
bounds
Диапазон элементов, которые необходимо удалить.Верхняя и нижняя границы границ должны быть допустимыми индексами строки и не должны совпадать с индексом конца строки.
bounds
Диапазон удаляемых элементов.Верхние и нижние границы границ должны быть допустимыми индексами строки.
В документации уже говорится, что диапазон не может включать endIndex строки, но я думаю, что это следует изменить.
Давайте рассмотрим пример почему.У меня есть строка «12345», и я хочу удалить первые три символа, что приведет к «45».Код для этого следующий:
// Remove the characters 123
var str = "12345"
let endRemoveIndex = str.index(str.startIndex, offsetBy: 2)
str.removeSubrange(str.startIndex...endRemoveIndex)
Пока все хорошо, я просто создаю закрытый диапазон от startIndex до startIndex, увеличенного на 2.
Допустим, я хочу удалитьсимволы «345» Я ожидаю, что следующий код будет работать:
str = "12345"
let startRemoveIndex = endRemoveIndex
str.removeSubrange(startRemoveIndex...str.endIndex)
Однако это не работает, как уже упоминалось в документации.Это приводит к тому, что fatalError говорит:
Невозможно пройти дальше endIndex
Код, который работает для удаления трех последних символов, следующий:
// Remove the characters 345
str = "12345"
let startRemoveIndex = endRemoveIndex
str.removeSubrange(startRemoveIndex..<str.endIndex)
Это, на мой взгляд, синтаксически неверно, поскольку оператор половинного диапазона подразумевает, что максимум не будет включен, но в данном случае это так.
Что вы думаете об этом?