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:)只返回原始范围.这种方法应该做什么?
relative(to:)是RangeExpression协议的要求,Swift的范围类型符合Swift 4.
这包括:
..<运算符创建的半开范围(Range&CountableRange)...运算符创建的封闭范围(ClosedRange&CountableClosedRange)...运算符创建的左手范围(PartialRangeFrom&CountablePartialRangeFrom)...运算符(PartialRangeUpTo)创建的封闭右手范围..<运算符(PartialRangeThrough)创建的半开右手范围正如文档所述,调用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)
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |