SwiftUI中如何将Stepper与Dictionary绑定以修改数值?
解决SwiftUI中字典绑定Stepper的问题
问题分析
你的代码存在两个核心问题:
- 绑定方式错误:
$basic[keyPath: name]的写法不成立,因为KeyPath是编译时确定的类型,无法直接用运行时的字符串key创建;而直接用$basic[name]会返回Binding<Int>?,Stepper无法接收可选类型的绑定。 - 顺序维护问题:Swift的
Dictionary本身是无序集合,即使使用sorted(by:>)遍历,每次字典更新时都会重新排序,无法稳定保持初始顺序。
修复后的代码
import SwiftUI struct AllSuppliesStruct: View { // 维护固定顺序的键数组,确保显示顺序和初始一致 private let basicKeys = ["Regular Staples", "Big Staples"] @State var basic = ["Regular Staples": 0, "Big Staples": 0] var body: some View { Form { Section(header: Text("Basic Supplies")) { // 遍历固定顺序的键数组 ForEach(basicKeys, id: \.self) { key in // 为每个键创建非可选的Binding Stepper( "\(key), \(basic[key] ?? 0)", value: Binding( get: { self.basic[key] ?? 0 }, set: { self.basic[key] = $0 } ), in: 0...10 ) } } } } } // 预览 struct AllSuppliesStruct_Previews: PreviewProvider { static var previews: some View { AllSuppliesStruct() } }
关键改动说明
- 固定顺序:新增
basicKeys数组存储键的初始顺序,遍历数组而非字典,确保Stepper的显示顺序始终和初始设定一致。 - 正确绑定:通过
Binding(get:set:)手动创建绑定,处理字典值的可选性,确保Stepper能获取到非可选的Int值,同时修改时更新字典对应键的值。 - 结构修正:原代码的
AllSuppliesStruct未遵循View协议,补充了: View声明,并添加了预览代码方便调试。
这样修改后,点击每个Stepper一次,字典会正确更新为["Regular Staples": 1, "Big Staples": 1],同时保持初始的显示顺序。
内容的提问来源于stack exchange,提问作者user20053202
相关产品推荐
相关产品推荐

