相对(to :)函数究竟做了什么?

Bra*_*ley 3 collections range swift swift4

这来自Swift标准库文档:

relative(to:)

返回此范围表达式描述的给定集合中的索引范围.

这是方法签名:

func relative<C>(to collection: C) -> Range<Self.Bound> where C : _Indexable, Self.Bound == C.Index
Run Code Online (Sandbox Code Playgroud)

除了它的解释:

参数

采集

用于评估此范围表达式的集合.

回报价值

适合切片收集的范围.返回的范围不保证在集合的范围内.呼叫者应该对返回值应用与用户直接提供的范围相同的前提条件.

最后,这是我的测试代码:

let continuousCollection = Array(0..<10)
var range = 0..<5
print(range.relative(to: continuousCollection))
//0..<5
range = 5..<15
print(range.relative(to: continuousCollection))
//5..<15
range = 11..<15
print(range.relative(to: continuousCollection))
//11..<15
let disparateCollection = [1, 4, 6, 7, 10, 12, 13, 16, 18, 19, 22]
range = 0..<5
print(range.relative(to: disparateCollection))
//0..<5
range = 5..<15
print(range.relative(to: disparateCollection))
//5..<15
range = 11..<15
print(range.relative(to: disparateCollection))
//11..<15
Run Code Online (Sandbox Code Playgroud)

在每种情况下,relative(to:)只返回原始范围.这种方法应该做什么?

Ham*_*ish 6

relative(to:)RangeExpression协议的要求,Swift的范围类型符合Swift 4.

这包括:

正如文档所述,调用relative(to:)带有给定的范围表达式Collection(其中范围具有Index与集合类型匹配的边界)返回Range适合切片的集合.

在半开范围的情况下,边界保持不变,正如您所观察到的那样.但是,结果将与其他范围类型不同.例如,对于闭合范围,上限将需要递增(因为它不再包括在内).对于部分范围,缺失的下限或上限需要由集合startIndex或" endIndex分别"填充.

例如:

let continuousCollection = Array(0 ..< 10)

do {
    let range = 0 ..< 5 // CountableRange
    print(range.relative(to: continuousCollection)) // 0..<5
}

do {
    let range = 0 ... 5 // ClosedCountableRange
    print(range.relative(to: continuousCollection)) // 0..<6
}

do {
    let range = 4... // CountablePartialRangeFrom
    print(range.relative(to: continuousCollection)) // 4..<10
}

do {
    let range = ..<9 // PartialRangeUpTo
    print(range.relative(to: continuousCollection)) // 0..<9
}

do {
    let range = ...3 // PartialRangeThrough
    print(range.relative(to: continuousCollection)) // 0..<4
}
Run Code Online (Sandbox Code Playgroud)

然后,relative(to:)要求RangeExpression允许标准库在其他方面编写一个通用的范围下标Collection,允许任意集合使用带有Index绑定的任意范围类型进行下标:

let continuousCollection = Array(0 ..< 10)

print(continuousCollection[0 ..< 5]) // [0, 1, 2, 3, 4]
print(continuousCollection[0 ... 5]) // [0, 1, 2, 3, 4, 5]
print(continuousCollection[4...]) // [4, 5, 6, 7, 8, 9]
print(continuousCollection[..<9]) // [0, 1, 2, 3, 4, 5, 6, 7, 8]
print(continuousCollection[...3]) // [0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)