Swift里对于字符串这些引入了index型,相对其他语言而言字符操作更安全了,但是问题就是一不注意搞错范围就会有各种离奇的bug。

在讲主题前,先说个小细节。
Swift里非常严密的定义了一大堆字符串长度量,但我们实际开发基本上只有字符(character)的长度有用。
还是上例子

var strTemp = "这只是一个萌萌哒小测试"

print("萌萌哒长度: " + String(strTemp.characters.count))

运行结果如下:

萌萌哒长度: 11

每次都要字符串.characters.count来取出字符串长度太过麻烦,索性扩张一下String好了

extension String {

var length: Int
{

return
self.characters.count

}

}

然后测试一下

print("萌萌哒长度:
" +
String(strTemp.length))

运行结果如下:

萌萌哒长度: 11

 

然后回到主题,Swift里面的各种计数以及索引所用的都是实际长度

比如文字长度,因为计数的是实际长度而不是数组索引数,endIndex不能直接用

比如有一个字符串

var test: String = "我是一个萌萌哒懒虫哥哥"

我们要想删除其最后一个字,如果直接这么写

test.remove(at: test.endIndex)

这么写会报错,说是索引超出范围。原因就是endIndex是实际的最后索引,而字符串这类数据类型的索引是从0开始的,所以要给endIndx-1但是最开始也说过了,Swift里的字符串索引是专用型,不能直接操作。还是看下面的代码

var strTemp2 = ""

strTemp2 =
String(strTemp.remove(at:
strTemp.index(before:
strTemp.index(before:
strTemp.endIndex))))

strTemp2 +=
String(strTemp.remove(at:
strTemp.index(before:
strTemp.endIndex)))

print(strTemp2)

运行结果如下:

测试

05-11 13:50