TGViewer
Мобильный кот Мобильный кот @ios_appdev · 2.49K subscribers
Post #182 3.72K
Когда структуры в Swift — не твои бро

Один из лучших докладов на Mobius 2025 Autumn. Очень люблю, когда докладчик копает глубоко, объясняет хорошо и разочаровывает меня в Swift.

💡Основное:

- Структуры не всегда ускоряют работу приложения, а не редко замедляют ее и увеличивают размер бинаря.
- Карта линковки (Link Map) позволяет посмотреть из каких сущностей состоит итоговый бинарь,
- С помощью LinkMap можно узнать размер сущностей, вырезанные символы, которые не используются в итоговом бинаре и являются кандидатами на удаление из кода, анализировать краши без DSYM.
- Для сохранения Link Map в файл необходимо включить настройку Build Setting → Linking - General → Write Link Map File. Файл будет сохранен в Derived Data с именем {Имя_таргета}-LinkMap-normal-arm64.txt.
- Имена символов манглированы, нужно деманглировать с помощью swift demangle '{Имя_символа}'
- Чем больше вложенность структур друг в друга, тем больше будет итоговый размер структуры. Обычно особенно проблемными являются компоненты дизайн-системы.
- Использование экзистенциальных контейнеров дополнительно увеличивает размер за счет создания сервисных методов witness table. То есть, если компилятор не может рассчитать конкретный тип, а ходит через протокол - ситуация ухудшается. Вот почему нужно использовать some/generic везде, где это возможно.
- Флаги оптимизации -O никак не влияют на рост размера структур.
- Необоснованный рост может быть в КБ, десятки и сотник КБ, и даже МБ для особо больших структур.
- Накладные расходы на поддержку работы структур от 2 КБ превышают расходы на использование ссылочных типов
- Добавление indirect для enum зачастую лечит проблемы, когда в качестве associated value используется "дрянная структура".
- Для определения того, какие структуры наиболее важны для такого рефакторинга можно построить граф вложенности структур (на основе Xcode index Store) и определить метрику центральности графа (Betweenness)

🧠 Мысли после доклада:

- А что там со SwiftUI? Вьюшки с кучей проперти-врапперов разгоняют размер и снижают скорость? Имеет ли смысл дробления вьюшек на более мелкие не только ради переписовок, но и облегчения размера?
- А что с NonCopyable структурами? Они не копируются и возможно в них нет такого большого количества сервисного кода.
- Как именно выглядят дженерики в итоговом файле - требует дополнительного изучения.

🔗 Ссылки:

- Видео (если у вас есть билет на конференцию)
  • 👍 14
  • ❤ 6
  • 🔥 4
  • 🤔 2
More from @ios_appdev
  1. Nov 30, 2025🤔 Embedded Swift в Swift 6.3 Мы уже видели, как Swift успешно захватил server-side, linux…
  2. Oct 17, 2025🍷Отличный повод выйти из техлидского запоя и запилить пятничный пост после полугода шоков…
  3. Jun 24, 2025#видеозаписи #МобильныйВторник Открываем новую видеозапись выступления: Кирилл Шумаков, Ва…
  4. Apr 16, 2025🫠 Прощай, Swift Сегодня второй рабочий день в роли Техлида. Два дня уже не программировал…
  5. Apr 16, 2025Презентация с доклада. PDF без анимаций, но для общей картины подходит отлично.
  6. Apr 16, 2025Mobius 2025. Итоги Было круто, если еще не бывали там - атакуйте мозг своего работодателю,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →