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来创建,其中的lowerBound
和upperBound
不免让人感到头痛,这让我们截取字符串也耗费了大量的时间.
我们在控制台分别打打印两个符号的range值 ( endRange为<
从后向前查找到得第一个的range) :
由此可知:
-
>
符号的 lowerBound 里的position为 6 , upperBound 里的position为 7 -
<
符号的 lowerBound 里的position为 11 , upperBound 里的position为 12
其实已经可以看出Swift3中Range的含义了.我们对比一下下图:
不难看出端倪,其实range的lowerBound
和upperBound
可以简单理解为光标的位置,字符是被这些光标的位置所 分割 的.
有了上面那张图,关于我们
这四个汉字的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来验证一下: