String.removeSubrange的实现不正确?

时间:2018-12-08 20:59:46

标签: ios swift string macos

我遇到了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)

我认为这在语法上是不正确的,因为半范围运算符意味着不会包含最大值,但在这种情况下是最大值。

您对此有何看法?

1 个答案:

答案 0 :(得分:0)

Hamish指出String.endIndex是一个“最后一个”位置,该位置比最后一个有效的下标参数大一个。