我如何使用 forEach 在 SwiftUI 中循环遍历不同命名的形状

How can I use forEach to loop through differently named shapes in SwiftUI

我有几个形状名称 circle1()、circle2()、circle3(),直到 circle20(),它们的属性都略有不同。 我怎样才能像使用字符串插值来循环遍历所有这些一样使用 forEach。

 ForEach(0..<20){ i in
            Image("circle\(i)").offset(x:CGFloat(i * 100),y:0)
}

上面的例子是针对一张图片的,效果很好,但是有没有办法对类似的命名形状做同样的事情?当然,下面的示例不起作用:

 ForEach(0..<20){ i in
            circle\(i).offset(x:CGFloat(i * 100),y:0)
}

您可以尝试类似的方法,并结合使用 .tag() 而不是数组索引,可以获得您想要的东西。

@State var shapes = [AnyView]()

var body: some View {
    Group {
        ForEach(0..<self.shapes.count, id: \.self) { i in
            self.shapes[i].offset(x: CGFloat(i * 10), y:100)
        }
    }.onAppear(perform: loadShapes)
}

func loadShapes() {
    for i in 0..<10 {
        shapes.append(AnyView(Circle()))
    }
    for i in 0..<10 {
        shapes.append(AnyView(Rectangle()))
    }
}

如果你真的需要使用形状名称,可能是这样的:

struct MyShape {
var name: String
var shape: AnyView
}

struct ContentView: View {
@State var shapes = [
    MyShape(name: "circle0", shape: AnyView(Circle())),
    MyShape(name: "circle1", shape: AnyView(Rectangle())),
    MyShape(name: "circle2", shape: AnyView(Circle())),
    MyShape(name: "circle3", shape: AnyView(Rectangle())),
    MyShape(name: "circle4", shape: AnyView(Circle()))]

var body: some View {
    Group {
        ForEach(0..<5) { i in
            self.getShapeByName("circle" + String(i)).offset(x: CGFloat(i * 10), y:100)
        }
    }
}

func getShapeByName(_ name: String) -> AnyView {
    if let theShape = shapes.first(where: { [=10=].name == name }) {
        return theShape.shape
    }
    return AnyView(EmptyView())
}
}