我找不到任何文档来解释订阅范围应该做什么。我希望它能够产生范围的第n个值,但它本身似乎返回了下标值。
let range = 10...20
let valueFromRange = range[2]
在这种情况下,我希望valueFromRange
等于12
,但它等于2
。对于所有范围(或者至少是Range<Int>
和Range<Double>
类型的所有范围)似乎都是这种情况。
这是我应该得到的价值吗?除了违背我认为可能是通常预期的行为之外,这种行为也是无用的。
答案 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。