#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
. Первая заглавная буква зарезервирована для именования Классов, Структур и Протоколов.