美文网首页
Swift3中利用Range截取字符串

Swift3中利用Range截取字符串

作者: codeCoder | 来源:发表于2016-11-02 15:51 被阅读3077次

    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

    相关文章

      网友评论

          本文标题:Swift3中利用Range截取字符串

          本文链接:https://www.haomeiwen.com/subject/rwwvuttx.html