所以我有一个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` ?
Run Code Online (Sandbox Code Playgroud)
由于比较运算符不适用于String.Index实例,唯一的方法似乎是使用字符串执行循环,advance但这对于这样一个简单的操作来说似乎有些过分.
beta 5发行说明提到:
Range的概念分为三个独立的概念:
- 范围,是连续离散
ForwardIndexType值的集合.范围用于切片和迭代.Comparable值的间隔,可以有效地检查遏制.间隔用于switch语句中的模式匹配和~=操作员.- 跨越
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
Run Code Online (Sandbox Code Playgroud)
(目前,似乎显式命名HalfOpenInterval是必要的,否则..<运算符Range默认创建一个,并且Range不支持contains,~=因为它仅使用ForwardIndexType.)