Как я могу использовать forEach для l oop через формы с разными именами в SwiftUI - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть несколько имен фигур circle1 (), circle2 (), circle3 (), вплоть до circle20 (), все с немного отличающимися атрибутами. Как я могу использовать forEach таким же образом, как я мог бы использовать интерполяцию строк для l oop через все из них.

 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)
}

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

, если вам действительно нужно использовать имена фигур, может быть что-то вроде этого:

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: { $0.name == name }) {
        return theShape.shape
    }
    return AnyView(EmptyView())
}
}
0 голосов
/ 13 апреля 2020

вы можете попробовать что-то вроде этого, и в сочетании с использованием .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()))
    }
}
...