String截取子字符串

  • 想到截取字符串首先想到的是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就是字符串索引类型的范围用...或者..<来表示

        // 截取子字符串
        var str = "hello, world!  telephone =12345"
        let startIndex = str.startIndex
        let endIndex = str.index(str.endIndex, offsetBy: -5)
        let range = startIndex..'  to expected argument type 'Range'
        let subStr = str.substring(with: range)
        print(subStr)

4,注意点

  • 截取字符串的时候创建范围的时候如果使用...会报错Cannot convert value of type 'ClosedRange'to expected argument type 'Range'意思就是传入闭的范围要使用..<来表示范围

  • 对于一个字符串的Range不能用于截取另外一个字符串因为两个字符串的存储结构不一样

你可能感兴趣的:(String截取子字符串)