Swift 范围类型 endIndex

Swift Range Type endIndex

如果您创建一个 var Range = 0...0,我希望 endIndex 为零。但实际上是1。

var myRange: Range<Int> = 0...0
print("start Index \(myRange.startIndex) End Index \(myRange.endIndex)")

output: "start Index 0 End Index 1"

如果包含 Int 类型的 Index,如何查询 Range 实例?

也许你可以参考Half-Open Range Operator

 var myRange: Range<Int> = 0..<0

outputs:"start Index 0 End Index 0"

半开范围运算符(a..<b)定义了从a到b的范围,但不包括b。而闭区间运算符(a...b)最终会变成(a..<b+1)

endIndex 实际上并未包含在 Range 中。 RangestartIndex ..< endIndex。因此,对于您的示例,0...0 存储为 0..<1,意思相同。

对于 Swift 1.2 你可以使用全局函数 contains 来检查 Int 是否包含在 Range:

var myRange: Range<Int> = 0...0
let i: Int = 1

if contains(myRange, i) {
    println("yes")
} else {
    println("no")    // prints "no"
}

对于Swift 2.0:

var myRange: Range<Int> = 0...0
let i: Int = 1

if myRange.contains(i) {
    print("yes")
} else {
    print("no")    // prints "no"
}

因为 Range 也是一个集合,你可以使用它的 minElement()maxElement() 方法,这将 return 正确的索引,尊重被关闭的范围( ...) 或半开 (..<).

所以下面的代码将按预期输出零:

let range: Range<Int> = 0...0
let min = range.minElement()!
let max = range.maxElement()!
print("min=\(min), max=\(max)")
// Output: "min=0, max=0"

注意:两种方法都有 O(elements.count) 复杂性,可能不适合某些情况。