SwiftUI实现指向数组元素的自定义get/set动态代理双向绑定
解决方案
问题本质
Item属于值类型,默认通过get方法返回的是数组中对应元素的副本,直接修改副本属性不会同步到原数组。而Swift中对值类型属性的修改遵循「先读全量值、修改属性、再写全量值」的语义,因此只要正确实现proxy的setter即可完成双向同步。
实现方案:完善proxy的setter逻辑
直接替换你Model里的proxy计算属性代码即可:
var proxy: Item? { set { // 校验选中ID存在、找到对应下标、新值非空才执行更新 guard let selectedID = selectedID, let index = items.firstIndex(where: { $0.id == selectedID }), let newValue = newValue else { return } // 替换数组对应位置的元素,@Published会自动触发变更通知 items[index] = newValue } get { // 原逻辑可简化为直接返回匹配元素 items.first(where: { $0.id == selectedID }) } }
验证效果
修改完成后,model.proxy?.word = words.randomElement()! 这类操作就可以正常同步修改原数组中的选中Item,同时触发所有关联视图刷新。
可选优化点
原代码中ForEach遍历数组下标时使用\.hashValue作为id存在稳定性问题,建议改为直接遍历元素生成Binding:
ForEach($model.items) { $item in SelectionVue(item: $item, model: model) }
内容的提问来源于stack exchange,提问作者Jayåk
相关产品推荐
相关产品推荐

