You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:27:21