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

SwiftUI:不使用enumerated()如何对数组索引进行排序?

SwiftUI数组排序与ForEach遍历问题解决

问题分析

你当前的代码存在核心逻辑错误:对排序后的数组取indices,再用该索引访问原objects数组,这导致最终显示的还是原数组的元素,完全没有应用排序结果。另外你纠结的enumerated()和Hashable协议其实是不必要的——你的Object已经实现了Identifiable,满足ForEach对元素唯一性的要求。

正确实现方式

直接遍历排序后的数组本身即可,这是SwiftUI中ForEach的标准用法:

struct ContentView: View {
  @State var objects = [
    Object(num: 3),
    Object(num: 5),
    Object(num: 6),
    Object(num: 2),
    Object(num: 4),
    Object(num: 1)
  ]
  
  var body: some View {
      VStack {
        // 直接遍历排序后的数组元素
        ForEach(objects.sorted(by: { $0.num > $1.num })) { object in
          Text("\(object.num)")
        }
      }
      .padding()
  }
}

若需修改原数组元素的场景

如果需要在交互中修改原数组的元素(比如调整position),可以通过元素的id在原数组中定位:

ForEach(objects.sorted(by: { $0.num > $1.num })) { sortedObject in
  Text("\(sortedObject.num)")
    .onTapGesture {
      // 通过id找到原数组中对应的元素位置
      guard let index = objects.firstIndex(where: { $0.id == sortedObject.id }) else { return }
      objects[index].position = CGPoint(x: 100, y: 100)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:05:39