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

SwiftUI中如何获取List行对应的IndexSet整数值?

解决SwiftUI List .onDelete获取行号的问题

先修正你代码里的两个关键问题:

  • ForEach直接遍历[String]会编译报错,因为String默认未遵循Identifiable协议,需要改用索引遍历的方式。
  • .onDelete的回调函数不能有返回值,必须是(IndexSet) -> Void类型,不能返回Int。

实现方案

IndexSet本身就存储了被删除元素对应的数组索引(从0开始),你只需要把索引值加1,就能得到从1开始的行号。具体实现如下:

import SwiftUI

struct FruitView: View {
    @State var fruits: [String] = ["banana", "apple", "grape", "pear", "kiwi"]
    
    var body: some View {
        List {
            // 通过索引遍历,既解决Identifiable问题,又能直接拿到元素索引
            ForEach(fruits.indices, id: \.self) { index in
                Text(fruits[index])
            }
            .onDelete(perform: handleDelete)
        }
    }
    
    func handleDelete(at indexSet: IndexSet) {
        // 单删除场景:获取第一个被删元素的索引
        if let index = indexSet.first {
            let rowNumber = index + 1
            print("被删除的行号:\(rowNumber),对应水果:\(fruits[index])")
        }
        
        // 批量删除场景:遍历所有被删元素的索引
        // for idx in indexSet {
        //     let row = idx + 1
        //     print("被删除的行号:\(row)")
        // }
    }
}

关键说明

  • IndexSet是一个有序整数集合,里面的每一个值都对应List中被删除元素在数组里的0起始索引。
  • 如果你需要的是从1开始的行号,只需要给索引值加1即可。
  • 改用fruits.indices遍历后,既能避免Identifiable的编译问题,又能直接关联元素的索引,方便后续操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:20:26