fa
Feedback
EasySwift iOS🍏

EasySwift iOS🍏

رفتن به کانال در Telegram

Все самое интересное в мире iOS разработки 🧑🏻‍💻 Предложить статью или новость: @EasySwiftBot По всем вопросам обращаться к @itereznikov

نمایش بیشتر
2 835
مشترکین
-124 ساعت
-77 روز
-1430 روز
جذب مشترکین
سپتامبر '26
سپتامبر '26
+3
در 0 کانال‌ها
اوت '26
+24
در 0 کانال‌ها
Get PRO
ژوئیه '26
+30
در 0 کانال‌ها
Get PRO
ژوئن '26
+28
در 0 کانال‌ها
Get PRO
مه '26
+61
در 0 کانال‌ها
Get PRO
آوریل '26
+40
در 0 کانال‌ها
Get PRO
مارس '26
+33
در 0 کانال‌ها
Get PRO
فوریه '26
+26
در 0 کانال‌ها
Get PRO
ژانویه '26
+32
در 0 کانال‌ها
Get PRO
دسامبر '25
+28
در 0 کانال‌ها
Get PRO
نوامبر '25
+20
در 0 کانال‌ها
Get PRO
اکتبر '25
+43
در 1 کانال‌ها
Get PRO
سپتامبر '25
+30
در 0 کانال‌ها
Get PRO
اوت '25
+35
در 1 کانال‌ها
Get PRO
ژوئیه '25
+34
در 0 کانال‌ها
Get PRO
ژوئن '25
+41
در 1 کانال‌ها
Get PRO
مه '25
+41
در 0 کانال‌ها
Get PRO
آوریل '25
+48
در 0 کانال‌ها
Get PRO
مارس '25
+60
در 0 کانال‌ها
Get PRO
فوریه '25
+70
در 0 کانال‌ها
Get PRO
ژانویه '25
+62
در 0 کانال‌ها
Get PRO
دسامبر '24
+47
در 0 کانال‌ها
Get PRO
نوامبر '24
+45
در 0 کانال‌ها
Get PRO
اکتبر '24
+62
در 0 کانال‌ها
Get PRO
سپتامبر '24
+53
در 0 کانال‌ها
Get PRO
اوت '24
+50
در 0 کانال‌ها
Get PRO
ژوئیه '24
+52
در 0 کانال‌ها
Get PRO
ژوئن '24
+46
در 0 کانال‌ها
Get PRO
مه '24
+54
در 0 کانال‌ها
Get PRO
آوریل '24
+57
در 0 کانال‌ها
Get PRO
مارس '24
+41
در 0 کانال‌ها
Get PRO
فوریه '24
+76
در 0 کانال‌ها
Get PRO
ژانویه '24
+122
در 0 کانال‌ها
Get PRO
دسامبر '23
+109
در 0 کانال‌ها
Get PRO
نوامبر '23
+84
در 1 کانال‌ها
Get PRO
اکتبر '23
+71
در 4 کانال‌ها
Get PRO
سپتامبر '23
+65
در 0 کانال‌ها
Get PRO
اوت '23
+92
در 0 کانال‌ها
Get PRO
ژوئیه '23
+80
در 0 کانال‌ها
Get PRO
ژوئن '23
+117
در 0 کانال‌ها
Get PRO
مه '23
+1 010
در 0 کانال‌ها
Get PRO
آوریل '23
+44
در 0 کانال‌ها
Get PRO
مارس '23
+86
در 0 کانال‌ها
Get PRO
فوریه '23
+76
در 0 کانال‌ها
Get PRO
ژانویه '23
+186
در 0 کانال‌ها
Get PRO
دسامبر '22
+143
در 0 کانال‌ها
Get PRO
نوامبر '22
+327
در 0 کانال‌ها
Get PRO
اکتبر '22
+356
در 0 کانال‌ها
Get PRO
سپتامبر '22
+107
در 0 کانال‌ها
Get PRO
اوت '22
+253
در 0 کانال‌ها
Get PRO
ژوئیه '22
+607
در 0 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
04 سپتامبر0
03 سپتامبر0
02 سپتامبر+2
01 سپتامبر+1
پست‌های کانال
🧭 Podlodka iOS Crew: разработка с AI С 14 по 18 сентября пройдет новый сезон Podlodka iOS Crew. В этот раз в центре внимания
+3
🧭 Podlodka iOS Crew: разработка с AI С 14 по 18 сентября пройдет новый сезон Podlodka iOS Crew. В этот раз в центре внимания авторов конференции то, как AI меняет iOS-разработку. Что ждёт участников: 🍏 Стратегия внедрения терминальных ИИ-агентов и MCP-интеграции в ежедневную iOS-разработку 🍏 AI как экзокостюм мобильного разработчика: harness, skills, CLI, orchestration, validation и evals 🍏 Знания о том, как запускать локальные модели на Apple Silicon 🍏 Готовые скрипты, которые можно забрать в свой проект: шаблон рабочего пространства агента, примеры скиллов и MCP, пайплайн от Jira-задачи до Merge Request. И это ещё не всё! Подробности о сезоне смотрите на сайте, и там же есть билеты по early-bird цене. 👉 Билеты на Podlodka iOS Crew А по промокоду swift_ioss получите скидку🎁

2
Миллион частиц на iPhone: строим аттрактор Лоренца на GPU с Metal 👀 Автор показывает практический эксперимент: симуляция аттрактора Лоренца на сотнях тысяч частиц полностью на GPU с помощью Metal - расчёт через вычисляемые шейдеры, ping‑pong буферы и рендер одного буфера как point primitives. Главное архитектурное решение простое и рабочее: состояние частиц живёт только на GPU, CPU лишь обновляет uniforms и кодирует команды. 💡 Проходится весь путь от формулы и выбора интегратора (Euler, RK2, RK4) до деталей реализации: выравнивание структур между Swift и MSL, создание staging/двух приватных буферов, выбор размеров threadgroup, отрисовка точек, additive blending и избегание waitUntilCompleted. ✏️ Что стоит забрать из статьи про работе с металом: ➡️ храните в particle buffer только то, что нужно ➡️ подбирайте threadgroup по возможности pipeline ➡️ ограничивайте frameDelta для стабильности ➡️ профилируйте через GPU Frame Capture прежде чем упрощать симуляцию ➡️ если рендер дорогой — уменьшайте pointSize, particleCount или меняйте blending ➡️ для продуктовой версии делайте пресеты по GPU time
411
3
Private properties no longer break the memberwise initializer in Swift 6.4 🆕 В Swift 6.4 изменили правило синтеза memberwise инициализатора для структур: теперь свойства, которые менее доступны, чем максимально возможный уровень доступа и при этом имеют значение по умолчанию, исключаются из синтезируемого инициализатора. ❓ Что это значит на практике: если вы добавили приватное поле вроде cached id = UUID() с инициализацией, оно больше не «тянет вниз» доступность всего инициализатора — внешний код всё ещё может вызывать Post(title:…, body:…) без доступа к id. Компилятор сохраняет обратную совместимость: дополнительно синтезируется старый, более закрытый инициализатор, доступный в том же файле. ❗️ Важно: ➡️ приватное свойство без значения по умолчанию всё ещё остаётся в инициализаторе и делает его приватным ➡️ если все свойства приватные, поведение не меняется (инициализатор остаётся приватным) ➡️ изменение упрощает рефакторинг: можно добавлять приватные детали (кеши, идентификаторы) без ручной правки инициализатора
587
4
WebRTC on iOS in 2026, without building a video call ℹ️ WebRTC - это не просто видео фреймворк, это реально рабочий P2P канал с обходом NAT и низкой задержкой. Автор крутит одно соединение между узлами и пять каналов данных: touch (быстро, без гарантий доставки), terminal (строго порядок и надёжность) и ещё три для команд, уведомлений и потоков логов. Благодаря разделению на каналы, мегабайты логов не мешают срочной команде отмены сборки. Несколько полезных советов: ➡️ на каждую комнату должен приходиться один постоянный клиент сигналинга. Если будет несколько - будет дерганье: старый клиент кикает новый, новый кикает старый — вечная петля. ➡️ при временных проблемах сети делаем ICE‑restart - не рвём всю связь; если же сессию захватили с другого устройства (другой device id) - полное повторное соединение и старое устройство не лезет назад автоматически ➡️ шлите меньше мусора в списке адресов - без TCP, без локальных 192.168 и без .local. TURN учётки выдавайте краткоживущие через свой сервер - секреты в бинарник не встраивайте ➡️ В фоне iOS не гарантирует сохранение UDP соединения. Поэтому при переходе в фон лучше корректно закрыть соединение, а при возвращении приложения восстановить его заново
576
5
Как мы построили систему регрессионного UI-тестирования для iOS-приложения: XCUITest, mock backend и XcodeBuildMCP 🖥 Статья описывает практическую архитектуру для масштабируемой UI-регрессии в зрелом iOS‑проекте. Вместо попыток заменить XCUITest авторы строят инфраструктуру вокруг него: роботы (Robot Pattern) инкапсулируют работу с интерфейсом, launch arguments управляют стартовым состоянием приложения, а собственный mock‑backend с профилями отвечает за детерминированные серверные ответы. Такой подход переводит единицу регрессии с отдельного теста на воспроизводимый сценарий: начальное состояние + конфигурация backend + действия пользователя + ожидаемый результат 🔴 Важная часть - интеграция ИИ‑агента через XcodeBuildMCP, который автоматизирует рутинный поиск маршрутов и генерацию XCUITest на основе текстового сценария и набора роботов. Агент работает в ограниченном рабочем контексте, генерирует нативный тест, собирает и запускает его, но финальную проверку и принятие кода делает разработчик; CI остаётся зависимым только от нативных тестов. Дополнительно Mock Admin даёт удобный интерфейс для активации, временных изменений и просмотра журнала запросов, что упрощает воспроизведение и диагностику проблем без риска случайно поломать регрессию ℹ️ Такой стек делает тесты короче, надёжнее и воспроизводимее - особенно для сценариев с retry, polling, push и deep link, где важны последовательность запросов и состояние сервера. Но нужно следить за синхронизацией mock‑профилей с реальным API (OpenAPI/контрактные тесты), чётко версионировать профили и держать правила генерации тестов в code review, чтобы ИИ‑генерация не создавала неожиданные зависимости
633
6
How to use SwiftData Статья для тех, кто не знает про SwiftData 🤔 🔍 SwiftData - современная замена Core Data с нативным апи: вместо xcdatamodeld и ручных fetch запросов используются макросы @Model, @Relationship, @Transient и #Predicate. Модель - просто класс с @Model: все свойства сохраняются по умолчанию, вычисляемые помечают @Transient, уникальные ограничения - через #Unique, а enum хранится при Codable ⚙️ Контейнер создаётся на уровне приложения (.modelContainer(for:)), вьюшки получают ModelContext из окружения и вставляют/удаляют объекты, вызывая save() когда важна консистентность. В SwiftUI для выборок - @Query (автообновление), вне view - FetchDescriptor и modelContext.fetch(…); только для подсчета - fetchCount(_:) Главные подводные камни: ➡️ id временный до первого save ➡️ всегда указывайте deleteRule и inverse в связях ➡️ предикаты поддерживают не весь Swift - некоторые вызовы либо не компилируются, либо падают в рантайме (например map/reduce, hasSuffix, сравнения вроде isEmpty == false).
621
7
NSTextTable in Swift 🆕 В iOS 27 UIKit добавили полноценные таблицы в составе атрибутированных строк - NSTextTable и NSTextTableBlock. Это не view‑таблица, а расширение rich‑text: таблица становится частью NSAttributedString, а не набором отдельный вьюшек. Важные оговорки: ➡️ NSTextTable описывает структуру: число колонок, алгоритм компоновки (.automatic или .fixed), поведение границ и т.п. ➡️ Каждая ячейка - NSTextTableBlock с позициями и span (как rowSpan/colSpan в HTML) ➡️ Ячейки привязываются к параграфам через NSMutableParagraphStyle.textBlocks, затем стиль применяется к части NSAttributedString ➡️ Ячейкам можно задать padding, margins, borders, фон, мин/макс размеры, проценты или абсолютные величины ⚠️ Когда не нужно использовать - большие наборы данных, прокрутка/ленивая подгрузка, интерактивные таблицы или таблицы типа spreadsheet - для этого лучше UICollectionView/UITableView.
696
8
Instruments Flame Graph Introduction 🔍 Если вы не знали, что такое flame-граф в Time Profiler, то самое время узнать - откро
Instruments Flame Graph Introduction 🔍 Если вы не знали, что такое flame-граф в Time Profiler, то самое время узнать - откройте Call Tree и нажмите правую кнопку над деталями, чтобы включить граф. Если кнопки нет, выбранный инструмент это не поддерживает. ❓ Flame‑граф это стопки прямоугольников, каждый - функция в стеке; ширина показывает, сколько времени функция была в стеке. Верхние строки - системные точки входа, ваши функции чаще ниже и отмечены синим. Самые «тяжёлые» вызовы находятся слева. ℹ️ Чтобы оставить только свой код включите Hide System Libraries в Call Tree; кликайте по прямоугольникам и двигайтесь стрелками; для чтения имён делайте зум: Option+клик и Option+прокрутка (или жест трекпада), Option+клик в пустом месте - вернуть масштаб.
700
9
بدون متن...
699
10
Building Testable SwiftData Applications 👀 В статье - как правильно тестировать SwiftData в iOS проектах, и главный акцент делает не на проверке самого фреймворка, а на защите бизнес логики. Для обычных юнит тестов лучше брать in-memory store, чтобы тесты были изолированными, быстрыми и не зависели друг от друга. ⚠️ В статье хорошо показано, какие тесты почти не дают пользы: например, когда вы просто проверяете, что модель сохранилась и снова прочиталась из базы. Гораздо ценнее тестировать реальные правила приложения - запрет одинаковых названий бюджета, корректный расчёт расходов, остатка и других важных значений. ⚙️ Отдельно автор показывает, что сложную логику лучше выносить из View в отдельные типы. Тогда код проще поддерживать, а тесты писать легче. В конце есть интересная мысль про ResultsObserver в iOS 27: он помогает наблюдать изменения SwiftData вне SwiftUI и тестировать такие сценарии без лишней возни с интерфейсом. 😊 Признавайтесь - тестируете SwiftData?
682
11
Picture-in-Picture в iOS: от запуска до переключения контента 🔍 Статья - практичный гайд по PiP на iOS. Автор показывает, как запустить системное «плавающее окно», настроить жизненный цикл и переключать контент без разрывов. Главный посыл: PiP - сквозной системный механизм, который живёт в отдельном окне и требует правильной подготовки. Что обязательно проверить: ➡️ AVAudioSession настроен на .playback/.moviePlayback и активен - без этого PiP не стартует ➡️ В Capabilities включён Background Modes -> Audio, AirPlay, and Picture in Picture. ➡️ AVPictureInPictureController хранится в сильной ссылке, иначе ARC удалит его до отрисовки Как жить с PiP в приложении: ➡️ Делегат нужен для восстановления интерфейса и очистки после остановки. ➡️ События управления (пауза/перемотка) не приходят через делегат. На iOS 18+ используйте AVMetrics, на более старых - KVO/Combine по timeControlStatus у AVPlayer. ➡️ Переключение видео без закрытия PiP: либо replaceCurrentItem(with:) у AVPlayer, либо, если пересоздаёте плеер, обновите contentSource у контроллера.
657
12
Building a reusable API client with URLSession in Swift 🔍 Очередной взгляд на то, как собрать лёгкий API‑клиент на базе URLSession и async/await. Выделяются общие шаги любых запросов, а именно: построение URLRequest, выполнение через URLSession, проверка HTTP ответа и декодирование JSON - и предлагает вынести их в одно место (APIClient) чтобы не дублировать код по проекту. Приводятся компактные типы: ➡️ Endpoint с путём ➡️ методом и заголовками ➡️ небольшая обработка ошибок (invalidResponse, invalidStatusCode) ➡️ методы для сборки запроса и отправки ➡️ пример декодирования модели 🖥 Можно еще выделить в качестве полезных советов: ➡️ конфигурация URLSession через URLSessionConfiguration для таймаутов и кэша ➡️ передача сессии в клиент для тестируемости ➡️ корректная проверка HTTPURLResponse (чтобы 404/500 не прошли незамеченными) ➡️ встроенная поддержка отмены через Swift concurrency (task отменяет запрос). В целом, можно взять как стартовую точку и расширить авторизацией, логированием и обработкой ошибок по бизнес‑логике.
658
13
An Even Closer Look at Protocols and Global Actors ❓ Как лучше задавать изоляцию @MainActor для протоколов в Swift — всей протоколу, отдельным требованиям или вовсе не ставить атрибут? ℹ️ На примере протокола для показа ошибок автор сравнивает «whole‑protocol» (удобно и сокращает код, но раньше мешало конформить акторы) и «per‑requirement» (более гибко, явнее поведение). ⚙️ Не вешайте @MainActor автоматически - сначала подумайте, где реально нужна синхронная работа с UI. Для внутренних API удобно использовать per‑requirement изоляцию, а для публичных или простых случаев можно сделать протокол не‑изолированным и перенести @MainActor на конкретные реализации. Особое внимание уделите параметрам (например, колбэкам) - им может понадобиться свой атрибут @MainActor или объявление как Sendable.
690
14
Splitting Large SwiftUI Views in the Apple's way 🔍 Интересная статья, где рассказывают, что для производительности в SwiftUI
Splitting Large SwiftUI Views in the Apple's way 🔍 Интересная статья, где рассказывают, что для производительности в SwiftUI важнее выделять отдельные структуры View с узкими входными данными, чем разбивать большой body на вычисляемые переменные или вспомогательные функции с @ViewBuilder. Когда меняется состояние, SwiftUI пересчитывает body самого внутреннего типа View, поэтому все вычисляемые поля внутри того же struct пересчитаются вместе - отдельный struct даёт собственную границу инвалидизации и может быть пропущен, если его входы не изменились. ❓ Что можно сделать (на примерах из статьи): ➡️ заменить private var section: some View на private struct SectionView ➡️ передавать только нужные данные (Bool, Double, модель) ➡️ выносить тяжёлые части интерфейса - карты, карточки завершения, сложные списки - в отдельные типы. ⚙️ @ViewBuilder остаётся полезным для локальной условной структуры (if/switch), он даёт читаемость и структурную идентичность веток, но он не создаёт новую границу инвалидизации и не решит проблемы с лишними пересчётами или потерей состояния при переключении веток. 🖥 Короткий чеклист для ревью кода: ➡️ если вычисляемое поле зависит от часто меняющегося state - выносить в отдельный View ➡️ не пытаться «симулировать» сплит через @ViewBuilder или вспомогательные модификаторы ➡️ предпочитать modifier(value ? a : b) вместо if-веток для одного view
760
15
Liquid Glass: A Field Guide to UIKit Compatibility Pitfalls 🖥 Если все еще не мигрировали на Liquid Glass на UIKit - статья для вас: практические проблемы адаптации UIKit на iOS 26, замеченные автором в реальном проект. ❓ Главные кейсы - кнопки навигации, таббар и взаимодействие с WKWebView. Для UIBarButtonItem с customView на iOS 26 наблюдались искажение размеров и исчезновение цветов: решение - полностью «изолировать» вью с явными constrain (ширина, высота и центр) или заменить UIKit вью на SwiftUI через UIHostingController; это в большинстве случаев восстанавливало и размеры, и цвет. 🔍 Немного про баги с новым API бейджей (иногда не обновляется - простой трюк: временно убрать и вернуть customView) и переносом порядка rightBarButtonItems (иногда помогает DispatchQueue.main.async или лучше - trailingItemGroups). ⚙️ Про UITabBarController и WKWebView: если вы динамически перестраиваете таббар во время закрытия модального контроллера, это может ломать интерфейс - ждущая окончания анимации dismiss решает проблему. При встраивании WKWebView стоит обязательно использовать viewport-fit=cover и env(safe-area-inset-*) в CSS, иначе контент может оказаться под таббаром (особенно при position: fixed). ℹ️ Наконец, есть баги без простого решения (например, смещение Stepper при появлении клавиатуры), поэтому автор советует тестировать на каждой поддерживаемой версии iOS и по возможности следовать HIG - чем дальше вы уходитe от стандартов, тем больше вероятность странных ошибок.
724
16
Saving lives with enums ℹ️ Статья показывает простую, но часто забываемую практику при работе с enum в Swift - не прятать случаи под default и не полагаться на прямое сравнение (==). Автор объясняет, что при добавлении новых кейсов компилятор не предупредит об уязвимых местах, если вы везде использовали default или ==. Это может привести к логическим ошибкам - в примере с мороженым человек с аллергией может получить опасный продукт. ✔️ Как одно из решений: делать «исчерпывающие» switch - явно перечислять все кейсы вместо default и переносить проверки в вычисляемые свойства или функции с exhaustive-switch. Тогда при добавлении нового кейса компилятор выдаст ошибку и вы вынуждены будете явно решить, как новый кейс обрабатывать. Это чуть более многословно, но даёт безопасность и явность. Можно также добавить правило в линтер, но это за пределами этой статьи. ⚠️ Если сомневаетесь - откажитесь от default и от частых == для enum, особенно если enum используется в логике принятия решений. Лучше перестраховаться, чем потом получить баг в проде…
700
17
Сейчас будет горячо: нагрев iOS-устройств как продуктовая метрика Зачем собирать thermal‑метрику в iOS и как? (Картинка перед
Сейчас будет горячо: нагрев iOS-устройств как продуктовая метрика Зачем собирать thermal‑метрику в iOS и как? (Картинка передает суть 🙂) 🔴 Вместо попыток мерить температуру в градусах автор предлагает использовать ProcessInfo.ThermalState - системную оценку теплового давления с четырьмя состояниями (nominal, fair, serious, critical). ThermalState нельзя перевести в градусы, но оно уже нормализовано между моделями и даёт понятный сигнал, когда система начинает троттлить I/O, снижать FPS или отключать периферию. 🔍 Читайте thermalState один раз перед регистрацией наблюдателя и логируйте изменения через thermalStateDidChangeNotification. А также отправляйте события в аналитику с контекстом (модель, экран, уровень батареи, зарядка, длительность сессии и т.д.). Это дешёвая в реализации метрика (одно свойство + нотификация + событие), но даёт полезные дашборды: ➡️ распределение по состояниям ➡️ по моделям ➡️ по экранам ➡️ время до first serious ➡️ сравнение версий ➡️ связь с Crash Rate и FPS. 🔥 На её основе можно приоритизировать оптимизации, включать адаптацию под конкретные устройства и реализовать реактивную деградацию в рантайме. let state = ProcessInfo.processInfo.thermalState NotificationCenter.default.addObserver( forName: ProcessInfo.thermalStateDidChangeNotification, object: nil, queue: .main ) { _ in let newState = ProcessInfo.processInfo.thermalState Analytics.track(thermalState: newState) }
730
18
Introducing the Safari MCP server for web developers ℹ️ Safari MCP‑сервер в бета‑версии Safari 27 и Safari Technology Preview 247 - это реализaция Model Context Protocol, которая позволяет LLM‑инструментам подключаться к окну Safari и получать реальную информацию о странице: DOM, сетевые запросы, скриншоты и консольные логи. Для iOS‑разработчика практическая польза такая: меньше ручных прогонов сценариев, быстрее проверка экранов после изменений, удобнее искать расхождения между ожидаемым и фактическим состоянием интерфейса, проще ловить проблемы с доступностью и состояниями форм. ❓ Можно использовать для некоторых кейсов: ➡️ упрощённая отладка без постоянного переключения между окнами ➡️ проверка совместимости в Safari ➡️ анализ производительности (navigation timing, загрузки ресурсов) ➡️ базовая проверка доступности ➡️ верификация состояний интерфейса (формы, потоки оформления заказа). 🖥 Запуск прост: установить нужную версию Safari, включить веб‑функции и удалённую автоматизацию, добавить mcp‑сервер в конфиг агента или выполнить одну из команд для Claude/Codex. MCP работает локально и не отправляет данные в Apple - дальнейшая судьба логов зависит от выбранного агента, поэтому используйте только доверенные инструменты.
635
19
How did Apple cut launch time by 30% in iOS 27? 🔼 Время запуска приложения - одна из самых важный метрик, которую многие не оптимизируют. Есть три вида запуска - cold, warm, resume. А сам процесс делится на до‑main (dyld, mmap, фиксация символов, статические инициализаторы) и после‑main (создание UIApplication, сцены, рендер первого кадра). 🔍 В статье автор показывает практическое сравнение трейсов запуска iOS 26 и iOS 27 с инструментами Xcode: App Launch и flamegraph. На его тестах iOS 27 даёт заметное ускорение - примерно 20–23% в примерах - в основном за счёт сокращения времени pre‑main (быстрее строятся кложуры, быстрее применяются fixups и выполняются статические инициализаторы). Часть улучшений объясняется параллелизацией и предзагрузкой данных на уровне системы. 👍 Выводы просты и применимы: профилируйте запуск (App Launch, фильтр на main-поток, скрывайте системные библиотеки), уменьшайте вес pre‑main (меньше динамических библиотек и тяжёлых статических инициализаторов) и минимизируйте работу до первого кадра. Системные оптимизации полезны, но основная ответственность за быстрый старт - на разработчике и архитектуре приложения.
710
20
Swift 6.2 против вашего оптимизатора: разбираемся с InlineArray, Span и strict memory safety на замерах ❓ Это не ещё одна сухая статья про ARC - автор взял три нововведения Swift 6.2, связанных с памятью, и проверил их «в бою»: замеры в release‑сборке, анализ ассемблера и SIL, перцентили вместо среднего, и честные проверки на оптимизатор. ❗️ Главная мысль: часто оптимизатор уже делает то, что обещают новые фичи, поэтому выигрыш встречается не везде, и важно понимать когда именно он реальный. 🖥 Что полезно помнить по фичам: InlineArray - настоящее преимущество там, где маленький фиксированный буфер лежит внутри структуры и её часто копируют; там вы избегаете retain/COW и получаете заметный выигрыш. Для локальных массивов же компилятор чаще сам помещает Array на стек, так что InlineArray не даёт чуда. 🔍 Span/MutableSpan - безопасная заменa небезопасных указателей: в горячих циклах код часто эквивалентен UnsafeBufferPointer, но Span избегает мостов к NSArray и даёт более предсказуемые хвосты; MutableSpan полезен при мутациях, когда надо избежать COW. ℹ️ В итоге: не гонитесь за «всегда быстрее» - используйте эти инструменты там, где они дают ясное семантическое преимущество, а не ради общих страховок про производительность.
712