SwiftUI ForEach绑定父视图数组元素到子视图报$subtask不在作用域如何解决
你遇到的报错是因为对绑定数组的遍历规则理解有误:当你给ForEach传入带$前缀的绑定数组($model.subtasks)时,遍历闭包返回的每个元素本身就是Binding<Subtask>类型,不需要额外再加$前缀获取绑定。你在subtask前加$相当于尝试获取Binding<Binding<Subtask>>类型的变量,自然会触发变量找不到的报错。
正确实现方式
方式1:标准写法(适配Swift 5.5+ / iOS 15+,向下兼容至iOS 13)
因为你的Subtask已经实现了Identifiable协议,直接遍历绑定数组即可,直接把闭包返回的subtask传给子视图的@Binding参数:
// Parent View 修正后的ForEach代码 ForEach($model.subtasks) { subtask in ChildView(subtask: subtask) }
如果你习惯用投影写法,也可以写成如下格式,效果完全一致:
ForEach($model.subtasks) { $subtask in ChildView(subtask: $subtask) }
方式2:索引遍历(适配所有SwiftUI版本)
如果你的项目需要兼容更老的Swift版本,也可以通过遍历数组索引的方式获取绑定:
ForEach(model.subtasks.indices, id: \.self) { index in ChildView(subtask: $model.subtasks[index]) }
之前尝试的写法问题说明
ForEach(model.subtasks) { subtask in:遍历返回的是Subtask值类型,不是绑定类型,无法直接传给@Binding修饰的参数- 另外两种加了
id参数的绑定遍历写法本身语法是正确的,只需要把传参时的$subtask改为subtask即可正常运行。
内容的提问来源于stack exchange,提问作者Clifton Labrum
相关产品推荐
相关产品推荐

