在使用swift的过程中字符串操作的时候会用到Range,刚开始使用起来各种别扭,然后发现居然还有ClosedRange、CountableClosedRange和CountableRange,这下就彻底头疼了,下面简单的描述一下它们的区别
从命名来代码来理解和区分 CountableClosedRange:可数的闭区间 CountableRange:可数的开区间 ClosedRange:不可数的闭区间 Range:不可数的开居间
下面通过代码来理解一下:
// 初始化测试:
// CountableClosedRange: [0,2]
let rangea = 0...2
// CountableRange: [0,2)
let rangeb = 0..<2
// ClosedRange: [0.1,2.1]
let rangec = 0.1...2.1
// Range: [0.1,2.1)
let ranged = 0.1..<2.1
// for循环测试:可数的,可以for循环
// CountableClosedRange:可数的可以for循环,输出0、1、2
for i in rangea {
print(i)
}
// CountableRange:可数的可以for循环,输出0、1
for i in rangeb {
print(i)
}
// for循环测试:不可数的,不能for循环
// ClosedRange:不可数,不能for循环,以下写法会报错
for i in rangec {
print(i)
}
// Range:不可数,不能for循环,以下写法会报错
for i in ranged {
print(i)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
总结
可以用可数和不可数、闭区间和开区间来理解记忆Range、ClosedRange、CountableClosedRange和CountableRange
可数:可以用于for循环
CountableClosedRange CountableRange
不可数:不能用于for循环
ClosedRange Range
闭区间:
CountableClosedRange ClosedRange
开区间:
Range CountableRange
另外查阅资料发现还有几个 PartialRangeThrough PartialRangeThrough 类型代表一个左边界无穷的闭区间 (-infinite, b] 其声明是:
struct PartialRangeThrough<Bound> where Bound : Comparable
我们可以用 prefix closed range operator (…b)创造一个PartialRangeThrough实例
let partialRangeThrough: PartialRangeThrough<Double> = …6.3
我们可以检查一个值是否在一个partialRangeThrough范围内
partialRangeThrough.contains(3.6)
// true
partialRangeThrough.contains(6.3)
// true
如果一个PartialRangeThrough用整数作为其边界,我们可以用它代表一个 collection 类型的索引 (从 0 到上边界)
let numbers = [10, 20, 30, 40, 50, 60, 70]
print(numbers[...3])
// [10, 20, 30, 40]
PartialRangeFrom
PartialRangeFrom 类型代表一个右边界无穷的闭区间 [a, +infinite)
其声明是:
struct PartialRangeFrom<Bound> where Bound : Comparable
我们可以用 postfix closed range operator (a…)创造一个PartialRangeFrom实例
let partialRangeFrom: PartialRangeFrom<Double> = 1.2…
我们可以检查一个值是否在一个PartialRangeFrom范围内
partialRangeFrom.contains(1.2)
// true
partialRangeFrom.contains(6.3)
// true
如果一个PartialRangeFrom用整数作为其边界,我们可以用它代表一个 collection 类型的索引 (从下边界到结束)
let numbers = [10, 20, 30, 40, 50, 60, 70]
print(numbers[3…])
// [40, 50, 60, 70]
PartialRangeUpTo
PartialRangeUpTo 类型代表一个左边界无穷的开区间 (-infinite, b)
其声明是:
struct PartialRangeUpTo<Bound> where Bound : Comparable
我们可以用 prefix half-open range operator (..<b)创造一个PartialRangeUpTo实例
let partialRangeUpTo: PartialRangeUpTo<Double> = ..<6.3
我们可以检查一个值是否在一个PartialRangeUpTo范围内
partialRangeUpTo.contains(1.2)
// true
partialRangeUpTo.contains(6.3)
// false, 因为上界是开区间
如果一个PartialRangeUpTo用整数作为其边界,我们可以用它代表一个 collection 类型的索引 (从0到上边界-1)
let numbers = [10, 20, 30, 40, 50, 60, 70]
print(numbers[..<3])
// [10, 20, 30]
参考链接:blog.csdn.net/wang6311069… www.jianshu.com/p/a0f355616…