【问题标题】:What is the correct behaviour of endIndex of array in Swift?Swift 中数组 endIndex 的正确行为是什么?
【发布时间】:2014-07-20 17:35:26
【问题描述】:

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

var ar = [1, 2, 3, 4]
ar.count // 4
ar.endIndex // 4

【问题讨论】:

  • 我喜欢这个作为我认为 endIndex 的更好选择:public extension Array { func lastIndex() -> Int? { guard !self.isEmpty else { return nil } return self.count - 1 } }

标签: arrays swift


【解决方案1】:

count 是集合中的项目数,而endIndex 是刚刚超过集合末尾的Index (from the Indexable protocol)

对于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

【讨论】:

  • 以这种方式拥有endIndex 的目的是什么?它提供了哪些附加功能,因为它似乎有点违反直觉。
  • 对于切片,start/endIndex 有点像元素的“标签”,引用原始数组中的原始位置,当您想要操作它时可以很方便。对于普通数组,endIndex 除了计数之外没有特殊用途。
【解决方案2】:

Array.endIndex 表示数组末尾的 1(或与计数相同),用于迭代目的,而不是下标。

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

【讨论】:

  • 这似乎很反直觉
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2015-12-05
相关资源
最近更新 更多