Swift中formIndex(after:)函数的索引操作疑惑解析
问题解析与解答
核心误区:forEach中的局部变量遮蔽了外部变量
你代码里的关键问题是**forEach闭包内的index是独立的局部变量**,和你外部定义的var index = arr.startIndex完全是两个不同的变量。
看这段代码:
var index = arr.startIndex arr.indices.forEach { index in print("before form index \(index)") }
闭包参数index和外部变量同名,直接遮蔽了外部变量。闭包里的index每次循环都会被赋值为数组的当前索引(0、1、2、3),但这完全不会影响到外部的index——循环结束后,外部的index还是初始值arr.startIndex(也就是0)。
关于formIndex(after:)的实际作用
formIndex(after: &i)的功能确实是把传入的索引替换成它的后继索引。在你的代码里,调用arr.formIndex(after: &index)后,外部的index已经从0变成了1(数组索引0的后继是1)。
但第二个forEach循环里你又用了同名的局部参数index,所以打印的还是数组的所有原始索引(0-3),和修改后的外部index没有任何关系。
为什么arr[0]和arr[index]看起来结果不同?
看你第二次测试的输出:
index is 0 arr index value before form index 1
这里的arr[index]取到的是1,和arr[0]结果一致,没有问题。
而调用formIndex之后:
arr index value after form index 5
这是因为外部的index已经被修改成1了,arr[1]的值就是5,和arr[0](值为1)当然不一样。你误以为index还是0,但实际上formIndex已经把它更新成了后继索引1。
验证formIndex效果的正确代码
如果要清晰验证formIndex的作用,应该直接打印外部的index,避免用同名局部变量干扰:
var arr = [1,5,10, 15] var index = arr.startIndex // 打印初始状态 print("初始index值:\(index)") print("对应数组值:\(arr[index])") // 调用formIndex更新索引 arr.formIndex(after: &index) // 打印更新后状态 print("更新后index值:\(index)") print("对应数组值:\(arr[index])")
输出结果:
初始index值:0 对应数组值:1 更新后index值:1 对应数组值:5
内容的提问来源于stack exchange,提问作者Evgeniy Kleban
相关产品推荐
相关产品推荐

