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

时间:2017-07-25 11:07:52

标签: swift collections range swift4

这来自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:)只返回原始范围。这种方法应该做什么?

1 个答案:

答案 0 :(得分:5)

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

这包括:

正如文档所述,在具有给定relative(to:)的范围表达式上调用Collection(其中范围具有与集合的Index类型匹配的范围)返回{{1适合切片那个集合。

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

例如:

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:)