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. В этот раз в центре внимания авторов конференции то, как 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, то самое время узнать - откройте 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 важнее выделять отдельные структуры 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 и как? (Картинка передает суть 🙂)
🔴 Вместо попыток мерить температуру в градусах автор предлагает использовать 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 |
