Выбор ответа Senior SwiftUI обновлено
Структурная идентичность и if/else
Вопрос
Чем плох код if isHighlighted { CardView().border(.red) } else { CardView() }?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ветки дают две view с разной идентичностью, и состояние CardView сбросится. SwiftUI определяет идентичность по положению в дереве: if/else создаёт ConditionalContent с двумя разными слотами.
Варианты ответа
- Ничем: SwiftUI сам объединит ветки в одну view и анимирует только рамку
- Не скомпилируется: в
bodyнельзяifбезGroupилиAnyView - Ветки дают две view с разной идентичностью, и состояние
CardViewсброситсяправильный ответ - Код медленнее, потому что условие
ifвычисляется на главном потоке
Разбор
SwiftUI определяет идентичность по положению в дереве: if/else создаёт _ConditionalContent с двумя разными слотами. Переключение уничтожает одну view (и её @State) и создаёт другую, вместо плавной анимации изменения получается transition. Лучше одна view с модификатором, зависящим от условия: .border(isHighlighted ? .red : .clear). if в body разрешён через result builder.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.