• Swift 中的Range和NSRange不同


    Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多的时间。不过,现在回过头来看看,发现Swift中的Ranges的使用还是比较合理的,但是想要正确的使用Ranges真的需要一些特别的技巧。

    看一个例子,下面这段代码展示的是截取以指定的字符开头和以指定的字符结尾的子字符串:

    1
    2
    3
    4
    5
    6
    var str = "Hello, playground"
      
    let rangeOfHello = Range(start: str.startIndex,
                             end: advance(str.startIndex, 5))
    let helloStr = str.substringWithRange(rangeOfHello)
    helloStr //"Hello"

    你可以看到,不能通过指定开始结束的Int值来获取Range,需要使用String类的startIndexendIndex属性(String.startIndex的类型不是Int),这就是Swift Ranges特别的地方。

    若想获取一个超出startIndex范围的Range,你可以使用上述代码里用到的advance的函数。advance也可以用于从结尾开始计算,所以如果你需要相对于endIndex获取index,像下面的代码一样,使用一个负数即可:

    1
    2
    3
    4
    5
    6
    let dob = "01/01/2000"
      
    let rangeOfYear = Range(start: (advance(dob.endIndex, -4)),
                            end: dob.endIndex)
    let yearStr = dob.substringWithRange(rangeOfYear)
    yearStr // "2000"

    不得不说,细细思量,Swift对于Ranges的使用十分干净和优雅,只要你熟悉了它的用法。

  • 相关阅读:
    [POJ 2096]Collecting Bugs
    [SPOJ 375]Query on a tree
    [BZOJ 4423][AMPPZ2013]Bytehattan
    [BZOJ 2038][2009国家集训队]小Z的袜子(hose)
    [SDOI 2017]数字表格
    [NOI 2010]能量采集
    [HNOI 2014]世界树
    [HNOI 2016]序列
    [HNOI 2016]大数
    [HEOI 2014]大工程
  • 原文地址:https://www.cnblogs.com/motoyang/p/4850443.html
Copyright © 2020-2023  润新知