Swift中数组的endIndex的正确行为是什么?

Kos*_*val 25 arrays swift

endIndex返回与count相同的值.这是正确的行为还是错误?

var ar = [1, 2, 3, 4]
ar.count // 4
ar.endIndex // 4
Run Code Online (Sandbox Code Playgroud)

jtb*_*des 25

count是集合中的项目的数目,而endIndexIndex(从Indexable协议),其是刚刚过去的集合的末尾.

因为Array,这些都是一样的.对于其他一些集合,例如ArraySlice,它们不是:

let array = ["a", "b", "c", "d", "e"]

array.startIndex  // 0
array.count       // 5
array.endIndex    // 5

let slice = array[1..<4]  // elements are "b", "c", "d"

slice.startIndex  // 1
slice.count       // 3
slice.endIndex    // 4
Run Code Online (Sandbox Code Playgroud)

  • 以这种方式拥有`endIndex`的目的是什么?它提供了哪些附加功能,因为它看起来有点违反直觉. (7认同)
  • 您在哪里读到 count 是一个 O(n) 操作?Collection 文档说 RandomAccessCollection 的复杂度为 O(1),数组是:https://developer.apple.com/documentation/swift/collection (2认同)

Cod*_*aFi 11

Array.endIndex 为迭代目的而不是下标,意味着是数组末尾的1(或与count相同).

let x = [1, 2, 3, 4]
for var i = x.startIndex; i < x.endIndex; i++ {
    println(x[i])
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎非常违反直觉 (7认同)