开发语言:Swift 4.2 开发环境:Xcode 10.1 在Swift中,有一套全新的截取字符串的方式 首先,我们要先熟悉以下两个类型 String.Index表示一个位置,使用String与String.Index可以获取该位置的Character 如上所示,我们构造了两个String.Index,分别表示String的第1个Character和第6个Character, 随后,使用这两个String.Index也输出了str的对应位置的Character。 但实际使用中我们往往不会手动构造String.Index,取而代之的是以下方法。 神奇的是,我们使用上面方法构造的String.Index,可以提供给任意一个String使用,而非只能用于构造它的String 可见,String.Index是独立于String存在的,用于获取或者表示某个Character位置的类型 Range<T> 表示一个T类型的范围,以下使用Range<Int>依次说明Range的几种构造方式和用法 输出: ["b", "c", "d", "e"] ["b", "c", "d", "e"] ["b", "c", "d"] ["b", "c", "d"] 我们可以使用lowerBound和upperBound来访问Range的起始位置和结束位置,注意无论是闭区间或半开区间,他们的upperBound的位置是一样的。 输出: 1 b 4 e 4 e 我们建立了四种不同类型的Range,分别为ClosedRange,CountableClosedRange,Range,CountableRange。 其中前两个为闭区间,后两个半开区间。 同时,Swift4.0又新增了单侧区间的概念,具体如下 输出: ["a", "b", "c", "d", "e"] //start~下标4(包括4) ["b", "c", "d", "e", "f"] //下标1~end ["a", "b", "c", "d"] //start~下标4(不包括4) 对于单侧区间,lowerBound和upperBound也只有一半,例如上例中的range1和rang3只有upperBound,range2只有lowerBound。 上一节我们介绍了Range是描述一个范围的类型,同样也构造了多种不同的Range<Int>来获取数组的值,但Range<Int>不能用来获取String的某一部分的值,想要获取String的某一部分的值,我们需要用到的是Range<String.Index> 下面我们使用3个String.Index构造5个不同的类型的Range<String.Index>,然后使用String[range]来截取字符串。 输出: 23456 //下标1~下标5(包括5) 67 //下标5~下标7(不包括7) 123456 //start~下标5(包括5) 23456789 //下标1~end 1234567 //start~下标7(不包括7) 使用Range<String.Index>可以轻松的截取一个String,但现实使用往往需要在一个String中查找或者截取另一个String的位置。 遇到这样的需求,我们可以使用如下方法 输出: 123 //截取4567前面的部分 89 //截取4567后面的部分 123 //效果与..<range.lowerBound一样,截取range.lowerBound前面的部分 89 //效果与range.upperBound...一样,截取range.upperBound后面的部分