这来自Swift Standard Library Documentation:
relative(to:)
返回此范围表达式描述的给定集合中的索引范围。
以下是方法签名:
func relative<C>(to collection: C) -> Range<Self.Bound> where C : _Indexable, Self.Bound == C.Index
连同其解释:
参数
集合
用于评估此范围表达式的集合。
返回值
适合切片收集的范围。返回的范围不保证在集合的范围内。调用者应该对返回值应用与用户直接提供的范围相同的前提条件。
最后,这是我的测试代码:
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
在每种情况下,relative(to:)
只返回原始范围。这种方法应该做什么?
答案 0 :(得分:5)
relative(to:)
是RangeExpression
协议的要求,Swift的范围类型符合Swift 4。
这包括:
..<
运算符创建的半开范围(Range
&amp; CountableRange
)...
运算符创建的封闭范围(ClosedRange
&amp; CountableClosedRange
)...
运算符创建的左手范围(PartialRangeFrom
&amp; CountablePartialRangeFrom
)...
运算符(PartialRangeUpTo
)..<
运算符(PartialRangeThrough
)创建的半开右手范围正如文档所述,在具有给定relative(to:)
的范围表达式上调用Collection
(其中范围具有与集合的Index
类型匹配的范围)返回{{1适合切片那个集合。
在半开范围的情况下,边界保持不变,正如您所观察到的那样。但是,结果将与其他范围类型不同。例如,对于闭合范围,上限将需要递增(因为它不再包括在内)。对于部分范围,缺少的下限或上限需要填充&#34;分别通过集合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
}
的{{1}}要求允许标准库(除其他外)编写a generic ranged subscript on Collection
,允许使用{{1}的任意范围类型下标任意集合bound(s):
relative(to:)