Modifying state during view update: почему нельзя присваивать @State внутри body
struct FilterView: View {
@State private var isEmpty = false
let items: [Item]
var body: some View {
isEmpty = items.isEmpty
return VStack {
if isEmpty { Text("Ничего не найдено") }
List(items) { item in Text(item.title) }
}
}
}
В консоли появляется предупреждение «Modifying state during view update», экран иногда зацикливается на перерисовках. Что здесь неверно по сути?
- body перестаёт быть чистым: присваивание @State внутри него запускает новый проход обновления
- @State нельзя менять из структуры, потому что она неизменяемая; нужно объявить body как mutating
- Предупреждение уходит, если обернуть присваивание в DispatchQueue.main.async — это и есть корректное решение
- Нужно заменить @State на @StateObject: изменения объекта из body безопасны
