下标范围的预期结果是什么?

时间:2014-06-08 16:08:09

标签: swift

我找不到任何文档来解释订阅范围应该做什么。我希望它能够产生范围的第n个值,但它本身似乎返回了下标值。

let range = 10...20
let valueFromRange = range[2]

在这种情况下,我希望valueFromRange等于12,但它等于2。对于所有范围(或者至少是Range<Int>Range<Double>类型的所有范围)似乎都是这种情况。

这是我应该得到的价值吗?除了违背我认为可能是通常预期的行为之外,这种行为也是无用的。

3 个答案:

答案 0 :(得分:1)

如果您想将其下标,请将范围转换为Array

let range = Array(10..20)
range[2] // returns 12

虽然您可以直接为此特定范围添加range.startIndex和下标,但您无需转换范围,而无需转换它们:

let range = (10..20).by(3)
range[2] // error: 'StridedRangeGenerator<Int>' does not have a member named 'subscript'

答案 1 :(得分:0)

范围中的n元素是range.startIndex + n元素。 因此,要获得您正在寻找的东西,您应该使用:

let valueFromRange = range[range.startIndex+2]

在您的情况下,range[12]

如果希望n元素具有索引n,则应将其转换为数组:

let rangeConverted = Array(range)
rangeConverted[2] // will return 12

答案 2 :(得分:0)

我认为range[subscript]可能并不真正支持。我没有任何确凿的证据,我可能错了,但似乎范围是这样的:

class Range {
  var _startIndex
  var _endIndex
}

现在,我不确定是否可以有非数字范围。如果没有,那么索引实际上是一个值。所以基本上10..20意味着范围从10开始到20结束。我猜测的是,对于for循环,

for i in 10..20 {}

相同
for i = _startIndex; i < _endIndex; i++

因此,range可能并不真正支持下标,它只是某些基类的一些继承的下标。

同样,没有确凿的证据,我也没有在任何参考文献中找到Range的文档。我也认为支持下标很好,但只是我的2c。