Выбор ответа Senior SwiftUI обновлено

Структурная идентичность и if/else

Вопрос

Чем плох код if isHighlighted { CardView().border(.red) } else { CardView() }?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ветки дают две view с разной идентичностью, и состояние CardView сбросится. SwiftUI определяет идентичность по положению в дереве: if/else создаёт ConditionalContent с двумя разными слотами.

Варианты ответа

  1. Ничем: SwiftUI сам объединит ветки в одну view и анимирует только рамку
  2. Не скомпилируется: в body нельзя if без Group или AnyView
  3. Ветки дают две view с разной идентичностью, и состояние CardView сброситсяправильный ответ
  4. Код медленнее, потому что условие if вычисляется на главном потоке

Разбор

SwiftUI определяет идентичность по положению в дереве: if/else создаёт _ConditionalContent с двумя разными слотами. Переключение уничтожает одну view (и её @State) и создаёт другую, вместо плавной анимации изменения получается transition. Лучше одна view с модификатором, зависящим от условия: .border(isHighlighted ? .red : .clear). if в body разрешён через result builder.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.