Swift3中利用Range截取字符串

Range在Swift中有了很大变化,先看一下苹果官方文档的描述:
A half-open interval over a comparable type, from a lower bound up to, but not including, an upper bound.
You create Range instances by using the half-open range operator (..<).
意思Range是一个半开半闭的可比的区间(左闭右开),你可以根据 ..< 符号来创建一个Range

废话不多说,直接上代码演示.
例如:截取字符串<title>关于我们</title>中的关于我们 这四个汉字.

class ViewController: UIViewController {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        let text = "<title>关于我们</title>"
        // 1.从前到后找到第一个 > 字符的range
        let startRange = text.range(of: ">")
        
        // 2.从后到前找到第一个 < 字符的range
        let endRange = text.range(of: "<", options: .backwards, range: nil, locale: nil)
        
        // 3.根据前两个的range得到他们中间四个汉字的range
        // 3.1 方法一,构造方法直接创建range
//        let searchRange = Range(uncheckedBounds: (lower: (startRange?.upperBound)!, upper: (endRange?.lowerBound)!))
        // 3.2 方法二,直接根据 ..< 创建range
        let searchRange = (startRange?.upperBound)! ..< (endRange?.lowerBound)!
        
        // 4.根据四个汉字的range截取字符串,得到结果
        let result = text.substring(with: searchRange)
        
        print(result)   // 关于我们
    }
}

关于Range

OC中的NSRange创建方法参数为int,Swift3中改用一个区间创建.
上面的方法中,四个汉字的range用括住他们的>,<两个符号的range中的bounds来创建,其中的lowerBoundupperBound不免让人感到头痛,这让我们截取字符串也耗费了大量的时间.

我们在控制台分别打打印两个符号的range值 ( endRange为<从后向前查找到得第一个的range) :

两个符号的Range

由此可知:

  • > 符号的 lowerBound 里的position为 6 , upperBound 里的position为 7
  • < 符号的 lowerBound 里的position为 11 , upperBound 里的position为 12

其实已经可以看出Swift3中Range的含义了.我们对比一下下图:


Range示意图

不难看出端倪,其实range的lowerBoundupperBound可以简单理解为光标的位置,字符是被这些光标的位置所 分割 的.
有了上面那张图,关于我们这四个汉字的range我们也照猫画虎的表示一下:

  • 关于我们 四个汉字的 lowerBound 里的position为 7 , upperBound 里的position为 11

即利用>符号range里的upperBound(7)和>符号符号range里的lowerBound(11),代码如下:

let searchRange = (startRange?.upperBound)! ..< (endRange?.lowerBound)!
或:
let searchRange = Range(uncheckedBounds: (lower: (startRange?.upperBound)!, upper: (endRange?.lowerBound)!))

最后:我们打印一下四个汉字的range来验证一下:


四个汉字的Range

推荐阅读更多精彩内容