如何为可更新的结构体绑定数组添加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") } } } } } } } }
关键说明
- 枚举适配Identifiable:原代码中
ForEach(UserType.allCases)会报错,给UserType添加id属性,让其符合Identifiable协议,解决遍历问题。 - 分组过滤逻辑:通过
$users.filter { $0.type.wrappedValue == type }筛选出当前分区对应的用户绑定数组,确保每个分区只展示对应类型的用户。 - 绑定数组元素:使用
ForEach($users...)遍历绑定数组,拿到的$user是Binding<User>类型,直接传给Toggle的isOn参数,修改开关状态时会自动同步回原users数组。 - 文本显示修正:将
Text("user.name")改为Text(user.name),避免显示字符串字面量,正确展示用户名称。
内容的提问来源于stack exchange,提问作者LateNate
相关产品推荐
相关产品推荐

