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<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不能用于截取另外一个字符串因为两个字符串的存储结构不一样

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • Swift 中的字符串截取 发表于2016-12-14||100 Substring in Swift 3.0 I...
    762683ff5d3d阅读 2,695评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • 人的一生就像一辆车,从起点开往终点。沿路有人上来有人下去,有的结伴而行,有的挥手告别。有的人也许只是你顺风车上的...
    墨嫣阅读 533评论 0 1
  • 画颗甜菜 虽然像萝卜 但素它是一颗叶脉红红的甜菜 磨人的小妖精 磨了我五天
    晨星手绘阅读 343评论 7 6