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

Swift数组subIndex工作机制及firstIndex返回值异常疑问

Swift 数组切片(ArraySlice)的下标工作机制及你的问题解析

问题根源

你代码里的leftDirection是ArraySlice类型,而非独立的Array。它本质是原数组的视图,会保留原数组的索引信息,所有索引相关操作(比如firstIndex)返回的都是元素在原数组中的绝对索引,不是切片自身的相对位置——这就是为什么明明切片只有2个元素,却返回索引3的原因。

逐行拆解你的代码逻辑

  1. 切片的生成逻辑
    你的leftDirectionArray是["d", "c", "b", "a"],计算出来的切片范围是2 ..< 4(因为(tools.count - index) -1 = (4-1)-1=2)。这个范围对应的是原数组的索引2和3,所以切片包含的元素是原数组索引2的"b"和索引3的"a"。

  2. firstIndex的返回逻辑
    当你在leftDirection上调用firstIndex(of: "a")时,它找到的是元素"a"在原数组leftDirectionArray中的索引3,而非切片里的第1个位置(相对索引1)。因为ArraySlice不会重新编排索引,它的索引体系完全继承自原数组。

解决方法:获取切片的相对索引

如果你需要得到元素在切片内的相对位置,有两种方式:

  • 把切片转为普通数组:转成Array后会生成新的独立数组,索引从0开始重新编排
    let realLeftArray = Array(leftDirection)
    let relativeIndexA = realLeftArray.firstIndex { $0 == target } ?? 0 // 返回1
    let relativeIndexB = realLeftArray.firstIndex(of: target) ?? 0 // 返回1
    
  • 手动计算偏移量:用返回的绝对索引减去切片的起始索引
    let absoluteIndex = leftDirection.firstIndex(of: target) ?? leftDirection.startIndex
    let relativeIndex = absoluteIndex - leftDirection.startIndex // 3 - 2 = 1
    

关键结论

  • ArraySlice是原数组的"视图",共享底层存储,所有索引操作都是基于原数组的绝对位置
  • 只有将切片转为普通Array,才会生成拥有独立索引体系的新数组

内容的提问来源于stack exchange,提问作者Underdog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:46:24