Исправьте предупреждение времени выполнения «Modifying state during view update»
Представление ниже во время выполнения печатает «Modifying state during view update, this will cause undefined behavior». Оно присваивает значение @State внутри body.
Требования:
- Объясните, что делает изменение недопустимым во время вычисления представления.
- Вынесите запись из прохода отрисовки так, чтобы значение всё равно устанавливалось верно.
struct CounterView: View {
@State private var count = 0
let start: Int
var body: some View {
count = start // вызывает предупреждение
return Text("Count: \(count)")
}
}
Найдите и исправьте ошибку.
Оно возникает, когда body меняет наблюдаемое состояние, пока SwiftUI ещё вычисляет этот body — присваивание @State во время вычисления. Вынесите изменение из прохода отрисовки в .onAppear, .task, .onChange или действие пользователя.
- ✗Присваивают значения
@State/@Publishedпрямо внутриbody - ✗Думают, что
DispatchQueue.main.asyncвокруг записи чинит первопричину - ✗Считают предупреждение безобидным, а не реальной ошибкой реэнтерабельности
- →Почему изменение наблюдаемого состояния во время вычисления
bodyне определено? - →Каким модификатором вы бы запустили изменение уже после появления представления?
body must be a pure function of state — it reads state to describe the view and must not write it. Assigning count = start while SwiftUI is evaluating body re-enters the update cycle (the write schedules another invalidation from inside the current one), which is the undefined behavior the warning names.
Move the write to a lifecycle hook that runs after the view is built, so it is not a side effect of rendering:
struct CounterView: View {
@State private var count = 0
let start: Int
var body: some View {
Text("Count: \(count)")
.onAppear { count = start } // runs after body, outside the render pass
}
}
If the value only needs to depend on start, initializing it once (@State private var count: Int set in init) or using .onChange(of: start) are equally valid — the rule is simply: never assign state as part of computing body.