我想知道功能
func formIndex(after i: inout Int)
据文献记载:
用其后继替换给定的索引。
但是如果我们在使用该函数后尝试打印出索引,它不会改变:
var arr = [1,5,10, 15]
var index = arr.startIndex
arr.indices.forEach { index in
print("before form index \(index)")
}
arr.formIndex(after: &index)
arr.indices.forEach { index in
print("after form index \(index)")
}
输出:
before form index 0
before form index 1
before form index 2
before form index 3
after form index 0
after form index 1
after form index 2
after form index 3
当我尝试打印出该索引的值时,情况变得更加令人困惑:
var arr = [1,5,10, 15]
var index = arr.startIndex
arr.indices.forEach { index in
print("before form index \(index)")
}
print("index is \(index)")
print("arr zero index value before form index \(arr[0])")
print("arr first index value before form index \(arr[1])")
print("arr index value before form index \(arr[index])")
arr.formIndex(after: &index)
arr.indices.forEach { index in
print("after form index \(index)")
}
print("arr zero index value after form index \(arr[0])")
print("arr first index value after form index \(arr[1])")
print("arr index value after form index \(arr[index])")
输出:
before form index 0
before form index 1
before form index 2
before form index 3
index is 0
arr zero index value before form index 1
arr first index value before form index 5
arr index value before form index 1
after form index 0
after form index 1
after form index 2
after form index 3
arr zero index value after form index 1
arr first index value after form index 5
arr index value after form index 5
看起来即使值为index
,0
我们对arr[0]
和处的值也有不同的结果arr[index]
。
您误解了它
formIndex(after:)
的作用。它不会以任何方式修改数组(mutating
毕竟它没有被标记)。它所做的只是将inout
您传递的参数设置为下一个索引。以下是演示:index
最初为 0。将其传递给 之后formIndex(after:)
,它变为 1,因为 1 是 0 之后的下一个索引。这就是它所做的全部事情。在文档的措辞中,“替换给定的索引”是指将
inout
参数设置为不同的值,“其后继”是指索引,而不是数组中的元素。为什么这样的方法有用?当然,在 上调用此方法很少有用
Array
。要获取 的下一个索引Array
,只需加 1。但是如果您正在使用任意Collection
(编写通用代码),这非常有用。任意Collection
不一定使用递增的Int
s 序列作为其索引。例如,Dictionary
是Collection
,它使用Dictionary.Index
值作为其索引。因此的目的
formIndex(after:)
在于给你提供一种方法来找到任何的给定索引的下一个索引Collection
。作为示例,这用于实现
firstIndex(of:)
:index(after:)
事实上,在遵守协议时,你需要实现一个类似的方法 - -Collection
。的默认实现formIndex(after:)
将把inout
参数设置为index(after:)
返回的任何值。您可以将 视为
formIndex(after:)
的“就地”版本index(after:)
。通过使用inout
参数,编译器可以将其优化为按引用传递(就像它采用指针一样),从而避免复制索引值。由于索引类型可以是任意类型,因此复制索引值可能会很昂贵。