Как добавить элементы в HStack с помощью ForEach SwiftUI

#variables #swiftui #progress-bar #hstack #swiftui-foreach

Вопрос:

Я довольно новичок в Swift, и я пытаюсь создать HStack (который будет использоваться в индикаторе выполнения) элемента и иметь возможность добавлять элементы с помощью кнопки. Я не уверен, следует ли мне использовать переменную в ForEach(1.. Вот код, который у меня есть до сих пор, но он не работал.

 struct ContentView: View {
@State var fill : CGFloat = 0
 

@Состояние var Количество окружностей : Int = 0
var тело: некоторое представление {

             HStack(spacing:100) {

                ForEach(0..<NumberOfCircles){ _ in
                   MyShape()
 

}

         Button(action: {NumberOfCircles = 5}, label: {
            Text("Button")
            
        })
        
    }
 

Комментарии:

1. В чем проблема с этим кодом? Утверждение «это не сработало» не говорит нам о проблеме.

Ответ №1:

ForEach в SwiftUI требуется постоянный диапазон для переключения. Однако, как следует из ошибки, если вы соответствуете Identifiable или используете ForEach(_:id:content:) и предоставляете явное id указание, оно будет удовлетворено. Так что попробуйте это:

 struct ContentView: View {
    @State var fill: CGFloat = 0
    @State var NumberOfCircles: Int = 0
    
    var body: some View {
        
        HStack(spacing: 20) {
            ForEach(0..<NumberOfCircles, id: .self){ _ in // <-- here
                MyShape()
            }
            Button(action: {NumberOfCircles = 5}){
                Text("Button")
            }
        }
    }

}
 

Ответ №2:

Я не уверен, в чем ваша проблема, но я протестировал этот код, и он работает:

 struct ContentView: View {
    @State var numberOfCircles = 1
    var body: some View {
        VStack {
            HStack {
                ForEach(0..<numberOfCircles, id:.self) { _ in
                    Circle()
                        .frame(width: 30, height: 30)
                }
            }
            Button { numberOfCircles = 5 } label: {
            Text("Add Circles")
        }
            
        }
    }
}
 

Кстати, соглашение об именовании переменных в Swift-это camelCase. Это означает , что, объявляя переменную, вы должны назвать ее numberOfCircles , а не NumberOfCircles . Первая заглавная буква зарезервирована для именования Классов, Структур и Протоколов.