SwiftUI嵌套ForEach引发编译器异常,求解决方案
SwiftUI多输出节点连接线绘制问题
我正在实现一个可相互连接的图形系统,每个图形节点可以连接到一个或多个下游节点。
数据模型
最初用类实现模型,通过直接引用关联节点,运行正常。但为了支持JSON序列化,我改为用ID数组替代直接引用,数据结构如下:
模型容器
@Observable class GadgetModel: Encodable, Identifiable { var gadgets = [GadgetNode]() }
节点定义
@Observable class GadgetNode : Identifiable, Codable, Hashable { public var gadgetType: GadgetType = .unassigned public var id: Int = 0 // GadgetNodes 和 GadgetViews 共享同一ID var input1: GadgetNode? var output1: GadgetNode? var inputs: [Int] = [] // 用节点ID替代直接引用 var outputs: [Int] = [] // 注:省略position属性(用于绘制位置)和其他无关实现 }
单输出版本(可正常运行)
之前单输出的版本,通过直接引用output1可以正常绘制连接线,代码如下:
ZStack { ForEach(gadgetModel.gadgets) { gadget in getGadgetView(gadget: gadget) let myPosition = gadget.position if let outputPosition = gadget.output1?.position { DataFlowLine( from: myPosition, to: outputPosition ) .animation(.easeInOut, value: outputPosition) } } }
多输出版本的问题
改成用outputs数组存储下游节点ID后,嵌套ForEach的代码无法编译,报错:Static method 'buildExpression' requires that 'some View' conform to 'AccessibilityRotorContent'。
我尝试将图形绘制和连接线绘制拆分,代码如下(注:原代码存在语法错误,已修正逻辑):
ZStack { // 绘制图形节点 ForEach(gadgetModel.gadgets, id: \.self) { gadget in getGadgetView(gadget: gadget) } // 为每个节点绘制到下游节点的连接线 ForEach(gadgetModel.gadgets, id: \.self) { gadget in let myPosition = gadget.position Group { ForEach(gadget.outputs, id: \.self) { outputId in if let targetGadget = gadgetModel.gadgets.first(where: { $0.id == outputId }) { let outputPosition = targetGadget.position DataFlowLine( from: myPosition, to: outputPosition ) } } } } }
拆分后又遇到需要绑定或代码复杂度超标的报错,试过用Group包裹但无效,想请教是否需要使用@ViewBuilder,以及可行的解决思路。
内容的提问来源于stack exchange,提问作者Andromeda
相关产品推荐
相关产品推荐

