我定义了两个协议
protocol AxisInstanceProtocol {
var name:String {get set}
}
protocol StyledAxisProtocol {
associatedtype AxisInstance: AxisInstanceProtocol
var axisInstances: [AxisInstance] {get set}
}我尝试构建SwiftUI视图结构。
struct StyledAxesView<StyledAxis: StyledAxisProtocol>: View {
@EnvironmentObject var environment: ContentManger
var body: some View {
VStack {
ForEach ((0..<environment.axes.count), id: \.self) { axisIndex in
StyledAxisView(styledAxis: self.$environment.axes[axisIndex])
}
}
}
}我将ContentManagerClass放在StyledViewAxis中,以筛选<StyledAxis:StyledAxisProtocol>。我觉得没问题。在以后的所有子视图中,将其定义为StyleAxesView<MyStyledAxis>.ContentManger比comapare类型容易得多。
extension StyledAxesView {
class ContentManger: ObservableObject {
@Published var axes: [StyledAxis] = []
}
}在底部,我有AxisInstance视图
struct InstanceView<AxisInstance: AxisInstanceProtocol>: View {
@Binding var instance: AxisInstance
var body: some View {
Text("\(instance.name)")
// Will be much more complicated, editing many parameters of the `instance`
}
}但我不知道如何使ForEach循环将instances传递到分隔视图中,并使它们成为@Binded (?)要更新整个[StyledAxis]数组,请执行以下操作。
struct StyledAxisView<StyledAxis: StyledAxisProtocol> : View {
@Binding var styledAxis: StyledAxis
var body : some View {
VStack {
ForEach ($styledAxis.axisInstances, id: \.self) { instance in
InstanceView(instance: instance)
}
}
}
}在这个版本中,我有一个错误Cannot convert value of type 'InstanceView<AxisInstance>' to closure result type '_'。我尝试了许多不同的方法,没有一个人编译。
发布于 2020-08-09 12:49:29
以下是可能的方法(仅修改部分,用Xcode 12测试)
struct StyledAxisView<StyledAxis: StyledAxisProtocol> : View {
@Binding var styledAxis: StyledAxis
var body : some View {
VStack {
ForEach (styledAxis.axisInstances.indices, id: \.self) { index in
InstanceView(instance: self.$styledAxis.axisInstances[index])
}
}
}
}https://stackoverflow.com/questions/63326404
复制相似问题