我遇到了String.removeSubrange函数的怪异行为。 这就是文档所说的:
删除给定范围内的字符。
参数
bounds
要删除的元素范围。上下限 of 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到2提前的startIndex的封闭范围。
让我们说我想删除字符“ 345”,希望下面的代码能起作用:
str = "12345"
let startRemoveIndex = endRemoveIndex
str.removeSubrange(startRemoveIndex...str.endIndex)
但是,由于文档已经提到,因此这不起作用。 这导致致命错误说
不能超过endIndex
以下用于删除最后三个字符的代码:
// Remove the characters 345
str = "12345"
let startRemoveIndex = endRemoveIndex
str.removeSubrange(startRemoveIndex..<str.endIndex)
我认为这在语法上是不正确的,因为半范围运算符意味着不会包含最大值,但在这种情况下是最大值。
您对此有何看法?
答案 0 :(得分:0)
Hamish指出String.endIndex是一个“最后一个”位置,该位置比最后一个有效的下标参数大一个。