我如何使用 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())
}
}
我有几个形状名称 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())
}
}