所以我有一个从搜索方法中获得的Range<String.Index>
实例。还有一个独立的String.Index
通过其他方式我怎么能告诉这个指数是否在上述范围内?
示例代码:
let str = "Hello!"
let range = Range(start: str.startIndex, end: str.endIndex)
let anIndex = advance(str.startIndex, 3)
// How to tell if `anIndex` is within `range` ?
由于比较运算符不适用于String.Index
个实例,唯一的方法似乎是使用advance
在字符串中执行循环,但这对于这样一个简单的操作来说似乎有点过分了。
答案 0 :(得分:5)
beta 5发行说明提到:
Range的概念分为三个独立的概念:
- 范围,是连续离散
ForwardIndexType
值的集合。范围用于切片和迭代。- 超过
Comparable
值的间隔,可以有效地检查遏制。间隔用于交换机中的模式匹配 陈述和~=
运营商。- 跨越
Strideable
值,这些值是可比较的,可以在O(1)中前进任意距离。
高效的遏制检查是您想要的,这是可能的,因为String.Index
是Comparable
:
let range = str.startIndex..<str.endIndex as HalfOpenInterval
// or this:
let range = HalfOpenInterval(str.startIndex, str.endIndex)
let anIndex = advance(str.startIndex, 3)
range.contains(anIndex) // true
// or this:
range ~= anIndex // true
(目前,似乎必须明确命名HalfOpenInterval
,否则..<
运算符默认会创建Range
,Range
不支持contains
1}}和~=
,因为它仅使用ForwardIndexType
。)