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
中。 Range
是 startIndex ..< 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)
复杂性,可能不适合某些情况。
如果您创建一个 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
中。 Range
是 startIndex ..< 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)
复杂性,可能不适合某些情况。