Swift Range类型endIndex

时间:2015-06-21 23:14:46

标签: swift range

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

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

输出:“开始索引0结束索引1”

如果包含Int类型的索引,我如何质疑Range实例?

3 个答案:

答案 0 :(得分:4)

endIndex实际上并未包含RangeRangestartIndex ..< 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"
}

答案 1 :(得分:0)

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

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

输出:&#34;开始索引0结束索引0&#34;

半开放范围运算符(a..<b)定义从a到b的范围,但不包括b。封闭范围运算符(a...b)最终将转为(a..<b+1)

答案 2 :(得分:0)

由于Range也是一个集合,因此您可以使用其minElement()maxElement()方法,这些方法将返回正确的索引,并且会关闭正在关闭的范围(...)或半开(..<)。

因此下面的代码将按预期输出零:

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)复杂度,可能不适合某些情况。