我遇到了一些时髦的Range
行为,现在我在Swift中质疑我认为我对Range
所知道的一切。
let range = Range<Int>(start: 0, end: 2)
print(range.count) // Prints 2
由于Range
使用了start
&amp; end
代替location
&amp; length
使用的NSRange
我希望上面的范围有3个数。看起来它似乎被视为NSRange
,因为如果你的{{ {1}}和location = 0
。
length = 2
我希望let array = ["A", "B", "C", "D"]
let slice = array[range]
包含slice
,因为范围的结束索引是2,但ABC
实际上包含slice
,它确实对应AB
,但是,由于范围range.count == 2
应该包含endIndex == 2
,所以不会累加。
我在这里缺少什么?
我正在使用Xcode 7.2的Swift版本,而不是任何开源版本。
答案 0 :(得分:0)
Swift中的范围对象Range<T>
显示为半开区间[start,end)
,即start..<end
(请参阅HalfOpenInterval IntervalType
)。
如果您打印range
变量
let range = Range<Int>(start: 0, end: 2)
print(range) // 0..<2
另外,正如Leo Dabus在下面指出的那样(谢谢!),您可以直接使用半开放范围运算符Range<Int>
来简化..<
的声明:
let range = 0..<2
print(range) // 0..<2 (naturally)
同样,您可以使用封闭范围运算符Range<Int>
...
范围
let range = 0...1
print(range) // 0..<2
我们有趣地(在问题的上下文中)看到,这再次验证Ranges的默认表示是通过半开操作符。
Range
的半开放时间间隔是Range
的默认值,在language reference for range中有一些隐含的文字写入:
与其他集合一样,包含一个元素的范围具有 endIndex 这是startIndex的继承者 ;并且空的范围 startIndex == endIndex。
CollectionType
符合startIndex
协议。在the language reference to the latter中,明确指出endIndex
和for i in startIndex..<endIndex {
let x = self[i]
}
定义了半开区间:
元素的序列视图与集合视图相同。 换句话说,以下代码将同一系列值绑定到 x与自我{}中的x一样:
Range
把它包起来; startIndex ..< endIndex
被定义为半开区间({
"type": "object",
"required":false,
"javaType":"model.Game",
"properties": {
"10": {
"id": "10",
"type": "object",
"properties": {
"success": {
"id": "success",
"type": "boolean"
},
"data": {
"id": "data",
"type": "object",
"properties": {
"type": {
"id": "type",
"type": "string"
},
"name": {
"id": "name",
"type": "string"
},
...
),即使在文档中找不到它也有些模糊。
另见
Swift包含两个范围运算符,它们是表达式的快捷方式 一系列价值观。
...
闭区域运算符(a ... b)定义从a到a的范围 b,包括值a和b。 a的值不能大于 比b。
...
半开范围运算符(a ...&lt; b)定义从a开始的范围 到b,但不包括b。据说这是半开放的 包含它的第一个值,但不是它的最终值。