切片维护指数
这不是一个完整的答案。但是有一点来自 Swift 的哥特式风格:
let array = [1,4,9,12,15]
你认为下面的值会一样吗?
print(array[2..<5].index(of:12)) // is it 1 or 3?
print(array.index(of:12)) // 3
是的!两者都会打印3。这是因为 ArraySlice 不会获得自己的唯一副本(除非 Array 发生了变异)。 ArraySlice 基本上是一种查看同一 Array 的某些索引的方法。它不会创建一个新的 [9,12,15] 数组并对其进行调查。它只会查看 original 数组的 给定范围。
现在怎么样?你认为下面的值会一样吗?
print(array[2..<5].index(of:1)) // nil
print(array.index(of:1)) // 0
不! ArraySlice 将打印 nil,而 Array 将打印 0
显然:
print(array[2..<4][2]) // 9
print(array[2..<4][0]) // ERROR: out of bounds
又一次令人惊讶:
print(array.dropFirst(2).index(of:15)
不是2。它将返回 4 作为其索引。为什么?因为dropFirst 返回一个ArraySlice。如果您不希望它维护索引,那么您应该从 ArraySlice 中构造一个新的 Array...
编辑:
来自docs:
与 Array 和 ContiguousArray 不同,ArraySlice 的起始索引
实例并不总是零。切片保持相同的索引
相同元素的更大数组,因此切片的起始索引
取决于它是如何创建的,让您执行基于索引的
对完整数组或切片进行操作。
如果您有兴趣了解更多。文档的链接还有另一个示例