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

如何为可更新的结构体绑定数组添加Section分组?

解决方案

核心修改要点

  • 按UserType过滤每个分组下的用户,确保每个分区只显示对应类型的条目
  • 为Toggle创建正确的绑定,保证开关状态修改能同步回原数组
  • 修正文本显示的语法错误

完整代码

enum UserType: Int, CaseIterable, Identifiable {
    case one = 1
    case two = 2
    
    // 让枚举符合Identifiable,支持ForEach遍历
    var id: Int { rawValue }
}

struct User: Identifiable {
    var id = UUID()
    var name: String
    var type: UserType
    var isOn: Bool
}

struct UserView: View {
    @State var users: [User] = [
        User(name: "James", type: .one, isOn: false),
        User(name: "Josh", type: .two, isOn: false),
        User(name: "Jim", type: .one, isOn: false),
        User(name: "Jake", type: .two, isOn: false)
    ]
    
    var body: some View {
        List {
            ForEach(UserType.allCases) { type in
                Section(header: Text("\(type.rawValue)")) {
                    // 过滤当前分组对应的用户,同时获取绑定对象
                    ForEach($users.filter { $0.type.wrappedValue == type }) { $user in
                        HStack {
                            Text(user.name)
                            Spacer()
                            Toggle(isOn: $user.isOn) {
                                Text("isOn")
                            }
                        }
                    }
                }
            }
        }
    }
}

关键说明

  1. 枚举适配Identifiable:原代码中ForEach(UserType.allCases)会报错,给UserType添加id属性,让其符合Identifiable协议,解决遍历问题。
  2. 分组过滤逻辑:通过$users.filter { $0.type.wrappedValue == type }筛选出当前分区对应的用户绑定数组,确保每个分区只展示对应类型的用户。
  3. 绑定数组元素:使用ForEach($users...)遍历绑定数组,拿到的$user是Binding<User>类型,直接传给Toggle的isOn参数,修改开关状态时会自动同步回原users数组。
  4. 文本显示修正:将Text("user.name")改为Text(user.name),避免显示字符串字面量,正确展示用户名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:02:43