Range家族

354 阅读2分钟

在使用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…