- 想到截取字符串首先想到的是OC的截取字符串的subString方法,所以自然联想到swift是否也提供相应的API,结果还真有相应的方法,但是需要传递的参数是什么呢?
1,String类型提供的截取字符串的方法
str.substring(with: Range)
str.substring(to: String.Index)
str.substring(from: String.Index)
2,我们发现参数都和String.Index有关那么String.Index是什么类型呢?
- 因为String类型是基于UNicode标量建立的, 所以不同的字符可能占用不同数量的内存空间(最明显的例子就是emoji字符占用两个)。所以如果要查找字符串中指定“位置”的字符就要从头开始依次计算当前字符所占空间大小,然后找下一个字符。所以我们不能再像OC那样使用整数类型的索引String为我们提供了其特有的索引类型String.Index还提供了相应的计算索引的方法
print(str2)
print(str2[str2.startIndex])
//注意String的endIndex不能作为访问其中字符的下标因为endIndex始终指向最后一个字符后面
print(str2[str2.index(before: str2.endIndex)])
print(str2[str2.index(after: str2.startIndex)])
print(str2[str2.index(str2.startIndex, offsetBy: 2)])
3,知道了String.Index那么Range<String.Index>就是字符串索引类型的范围用...或者..<来表示
// 截取子字符串
var str = "hello, world! telephone =12345"
let startIndex = str.startIndex
let endIndex = str.index(str.endIndex, offsetBy: -5)
let range = startIndex..<endIndex // 注意 这里不能包含endIndex 不然会报错 Cannot convert value of type 'ClosedRange<String.Index>' to expected argument type 'Range<String.Index>'
let subStr = str.substring(with: range)
print(subStr)
4,注意点
截取字符串的时候创建范围的时候如果使用...会报错Cannot convert value of type 'ClosedRange'to expected argument type 'Range'意思就是传入闭的范围要使用..<来表示范围
对于一个字符串的Range不能用于截取另外一个字符串因为两个字符串的存储结构不一样