Неправильная реализация String.removeSubrange? - PullRequest
0 голосов
/ 08 декабря 2018

Я столкнулся со странным поведением с функцией 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)

Это, на мой взгляд, синтаксически неверно, поскольку оператор половинного диапазона подразумевает, что максимум не будет включен, но в данном случае это так.

Что вы думаете об этом?

1 Ответ

0 голосов
/ 09 декабря 2018

Хэмиш указал, что String.endIndex - это позиция «после конца», которая на одну позицию больше, чем последний действительный аргумент нижнего индекса.

...