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

SwiftUI中如何将Stepper与Dictionary绑定以修改数值?

解决SwiftUI中字典绑定Stepper的问题

问题分析

你的代码存在两个核心问题:

  1. 绑定方式错误:$basic[keyPath: name]的写法不成立,因为KeyPath是编译时确定的类型,无法直接用运行时的字符串key创建;而直接用$basic[name]会返回Binding<Int>?,Stepper无法接收可选类型的绑定。
  2. 顺序维护问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:40:21