Swift Range的行为类似于NSRange,不包括endIndex

时间:2015-12-31 00:15:34

标签: swift

我遇到了一些时髦的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版本,而不是任何开源版本。

1 个答案:

答案 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中,明确指出endIndexfor 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。据说这是半开放的   包含它的第一个值,但不是它的最终值。