如何在SwiftUI中为Dictionary提供编辑界面
错误原因
直接对@Binding修饰的字典使用$entries[key]语法会触发编译问题,根源有两个:
- SwiftUI 中
Binding对字典的默认下标返回值为Binding<Value?>可选类型,而TextField要求传入的是Binding<String>非可选类型,类型不匹配 - 字典不属于
MutableCollection类型,不支持Binding的默认下标访问语法
正确实现方案
因为你明确编辑过程中字典的键固定,可确定遍历到的key一定存在于字典中,我们可以手动构造非可选的Binding实例来完成绑定,修正后代码如下:
struct DictionaryEditor: View { @Binding var entries: [String: String] var body: some View { List { ForEach(entries.sorted(by: <), id: \.key) { key, _ in HStack { Text(key) TextField("", text: Binding( get: { entries[key] ?? "" }, set: { entries[key] = $0 } )) } } } } }
代码说明
- 这里没有使用系统自动生成的
$entries语法,而是通过Binding的自定义构造方法分别实现读、写逻辑 get闭包返回对应key的存储值,使用?? ""做兜底处理,即使出现key缺失的异常场景也不会触发崩溃set闭包将TextField输入的新值直接赋值给字典对应key的位置,完成数据更新
内容的提问来源于stack exchange,提问作者Mussau
相关产品推荐
相关产品推荐

