在 Swift 里:
Range<Bound> 表示左闭右开区间 [lowerBound, upperBound)
ClosedRange<Bound> 表示闭区间 [lowerBound, upperBound]
其中 Bound 必须遵循 Comparable 协议。
例如:
0...12 // 闭区间,0,1....,12
0..<12 // 半开区间,0,1...,11
array[0...] // 单边区域,从 0 到数组末尾
...5 // 不指定起点/终点,小于 5
可以通过区间运算符对数组进行切片或条件判断。
常用属性
1、lowerBound
区间起点,Bound类型。
let r = 1..<5 // Range<Int>
r.lowerBound // 1
适用于 Range、ClosedRange、PartialRange 等。
2、upperBound
区间终点非包含元素,Bound类型。
let r = 1..<5
r.upperBound // 5
注意:upperBound 是左闭右开区间的“右边界”,不包含在区间内。
而在闭区间中(ClosedRange),upperBound则包含在区间中:
let cr = 1...5
cr.upperBound // 5
3、isEmpty
区间长度是否为 0。
let r = 2..<2
r.isEmpty // true
闭区间通常不为空,除非 lowerBound > upperBound。
4、contains(_:)
判断某个元素是否在区间内。
let r = 1..<5
r.contains(3) // true
r.contains(5) // false
对闭区间(ClosedRange)来讲:
let cr = 1...5
cr.contains(5) // true
5、clamped(to:)
把当前区间限制到另一个区间内。
let r1 = 1..<10
let r2 = 5..<15
let r3 = r1.clamped(to: r2) // 5..<10
扩展属性/方法
如果区间类型的 Bound 是 Strideable(比如 Int、Double),可以使用:
1、count:元素个数。
let r = 1..<5
r.count // 4
2、reversed():反向迭代区间。
for i in (1..<5).reversed() {
print(i) // 4 3 2 1
}
3、stride(by:)(结合 stride):
for i in stride(from: 1, to: 10, by: 2) {
print(i) // 1, 3, 5, 7, 9
}
总结
左闭右开区间(Range)/闭区间(ClosedRange)的核心属性是 lowerBound 和 upperBound,其他都是围绕“判断元素是否在区间内”或“迭代区间”来操作的。
