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
相关产品推荐
相关产品推荐

