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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:09:04