如何比较Swift String.Index?

cha*_*rit 3 swift

所以我有一个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但这对于这样一个简单的操作来说似乎有些过分.

jtb*_*des 5

beta 5发行说明提到:

Range的概念分为三个独立的概念:

  • 范围,是连续离散ForwardIndexType值的集合.范围用于切片和迭代.
  • Comparable值的间隔,可以有效地检查遏制.间隔用于switch语句中的模式匹配和~=操作员.
  • 跨越Strideable可比较的值,可以在O(1)中前进任意距离.

有效遏制检查是你想要的,这是可能的,因为String.IndexComparable:

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.)