Это то же самое, что вы написали выше, но немного чище:
@State private var randomNumber = Int.random(in: 0..<5)
var body: some View {
ForEach(0..<randomNumber, id: \.self) { _ in
Button(action: {
self.randomNumber = Int.random(in: 0..<5)
}) {
Text("\(self.randomNumber)")
}
}
}
При нажатии кнопки (или кнопок) в консоли выводится следующая ошибка:
ForEach<Range<Int>, Int, Button<Text>> count (2) != its initial count (1).
ForEach (: content:) should only be used for *constant* data. Instead conform data to
Идентифицируемый or use
ForEach (: id: content:) and provide an explicit
id !
Что это означает что для непостоянных (изменяющихся) данных при инициализации ForEach
должен быть указан либо идентификатор, либо данные должны соответствовать опознаваемому. Таким образом, SwiftUI сможет отличать guish новые данные от старых.
Правильный код будет выглядеть так (также я изменил lowerBound на 1, так что всегда одна кнопка):
@State private var randomNumber = Int.random(in: 1..<5)
var body: some View {
ForEach(0..<randomNumber, id: \.self) { _ in
Button(action: {
self.randomNumber = Int.random(in: 1..<5)
}) {
Text("\(self.randomNumber)")
}
}
}
Или, если вы хотите что-то более компактное:
@State private var random = Int.random(in: 1..<5)
var body: some View {
ForEach(0..<random, id: \.self) { _ in
Button("\(self.random)") {
self.random = Int.random(in: 1..<5)
}
}
}