Карточка про View Identity полностью переработана
Раньше она занимала ~30-40 минут чтения и охватывала базу - что такое identity, как работает structural и explicit, основные подводные камни и некоторые нюансы.
Раньше она занимала ~30-40 минут чтения и охватывала базу - что такое identity, как работает structural и explicit, основные подводные камни и некоторые нюансы.
Теперь - это 7 крупных разделов по 20-50 минут каждый, с разбором внутренней механики, эмпирическими тестами и ссылками на WWDC.
Да, карточка давно напрашивалась на обновление и дополнение, но "руки не доходили".
• 6 экспериментов с print(type(of:)). Раньше было 4 базовых эксперемента. Теперь добавились несколько важных: _ConditionalContent, как @ViewBuilder через buildEither фиксирует обе ветки в типе. И эксперимент 6 - сравнение if/else и тернарного оператора, главная идея "тип определяет поведение - destroy + create или update".
• Систематика "три свойства хорошего id". Раньше был общий совет "используй стабильный id". Теперь же проверки по возрастанию сложности: уникальность внутри коллекции, стабильность на протяжении жизни объекта, персистентность между разными источниками одного объекта.
Каждое свойство - с антипаттерном и примером "когда нарушается". Особенно важно третье - почему let id = UUID() в Decodable модели это баг, который проявляется при swipe-to-refresh и сбрасывает весь список. Его даже на собесах можно увидеть.
• Глубокий разбор id: \.self. Полная картина: что компилятор автоматически делает, почему \.self хеширует все stored properties, конкретный пример с Item и hasNotification, что именно ломается при мутации - 5 пунктов. Плюс отдельный раздел "где \.self уместен" с 4 безопасными случаями.
• Type erasure - новая большая секция. Целых 5 крупных подразделов: @ViewBuilder как DSL с трансформациями, почему AnyView ломает identity, эмпирическая проверка с тестовым кодом. Группа сохраняет тип без layout обёртки, дженерик контейнеры как правильная замена AnyView, и три легитимных случая, когда AnyView всё-таки нужен.
Identity - это фундамент для понимания состояния: @State, @StateObject, жизненного цикла и оптимизаций SwiftUI.
Если будешь читать карточки про Layout, AttributeGraph, Render Tree - identity упоминается там постоянно, и теперь ты знаешь её на уровне устройства.
swiftui