gram news
Аватар канала EasySwift iOS

EasySwift iOS

@swift_ioss

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

2,830подписчиков

Открыть канал

Последние посты

  • EasySwift iOS

    21 сент., 09:05

    AI-агент вместо ручного регресса: или bottom-up инициатива, которая смогла💎 В AI-центре я в основном занимаюсь B2C-продуктами. И на одном из них мы тесно работали с VLM (Visual Language Model) — моделью, которая умеет «видеть» интерфейс и понимать его примерно как человек.🔥 Параллельно мы брейнштормили AI-based инициативы, которые могли бы ускорить и упростить нашу работу. И подумали: а что, если дать VLM изображение с симулятора, научить её тапать, свайпать и скроллить, а затем обогатить тест-кейсами из Allure? Так и появился прототип AI-агента для автоматизации регресса.✏️ Сейчас проект уже вышел за рамки MVP: мы активно его развиваем и интегрируем в другие команды. Что получилось, с какими сложностями столкнулись и как их решали — рассказываем в статье.
    Иллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOS
  • EasySwift iOS

    17 сент., 06:01

    New Hashable conformances in Swift 6.4❓ В Swift 6.4 добавил Hashable к нескольким типам стандартной библиотеки, которые уже можно было сравнивать, но нельзя было использовать как ключи словаря или элементы Set.⚠️ Главное по изменениям:➡️ Dictionary.Keys теперь Hashable. Можно хранить view ключей прямо в Set или использовать как ключ словаря, равенство и хеширование основаны на множестве ключей (порядок и значения не важны). Когда порядок важен, явно сортируйте ключи или превращайте их в массив.➡️ CollectionOfOne и EmptyCollection получили условные Equatable/Hashable. Это в основном повышает согласованность стандартной библиотеки и помогает в обобщённых алгоритмах.➡️ UnownedTaskExecutor стал Hashable. Это удобно для
  • EasySwift iOS

    14 сент., 07:00

    Running iOS Background Tasks Reliably, Part 1🖥 Автор делится практическими наблюдениями по использованию BGTaskScheduler в iOS 26 на примере своего приложения для синхронизации календарей. Ключевая мысль: фоновые задачи на iOS нельзя воспринимать как cron - система даёт только возможности, а не гарантии. Тем не менее при аккуратной настройке - регистрация обоих типов задач (BGAppRefreshTask и BGProcessingTask), ограничение времени выполнения, защита от гонок при завершении и агрессивная, но осмысленная перезапись задач - можно получить достаточную надёжность для большинства сценариев.❗️ Пару важных моментов: ➡️ ставьте короткие таймауты (примерно 3 с для обновлений и ~25 с для тяжёлой обработки) ➡️ используйте token/lock, чтобы вызывать
    Иллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOS
  • EasySwift iOS

    11 сент., 09:00

    From Using AI to Delegating Work to AI (Part 2): What I Mean by DelegabilityВ продолжении прошлого поста про делегирование задач ИИ.⚙️ Отдавать задачи ИИ работает только при строгих правилах - человек задаёт цель, границы и критерии принятия, а система должна выполнять работу в этих пределах, запрашивать недостающие данные и останавливать выполнение при пробеле.Важные элементы: ➡️ внешняя запись для передачи состояния между контекстами ➡️ детерминированный рантайм, который гарантирует единый порядок чтения, валидации и записи результатов ➡️ чёткое разделение ответственности между человеком (намерение, авторизация), моделью (исполнение в границах) и инструментами (факты и состояние).✔️ Оформляйте задачи как контракт -
    Иллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOS
  • EasySwift iOS

    9 сент., 06:03

    From Using AI to Delegating Work to AI (Part 1): Why I No Longer Wait for Stronger Models🔍 Интересная статья-размышление на тему: не «какой AI лучше», а про то, почему даже сильные модели пока не решают задачу полноценной передачи работы на автопилот. Автор пишет, что у AI есть разные удобные режимы: чат для обсуждения, встроенная помощь в приложении для быстрых подсказок и агент для более длинных цепочек действий. Но главный вывод другой: способность модели выполнить задачу еще не значит, что ей можно спокойно доверить весь процесс без постоянного контроля.🔴 В реальной разработке мало просто сгенерировать код или получить ответ на вопрос, нужно еще четко задать границы задачи, критерии готовности, проверки и правила передачи между этапами. Автор подчеркивает, что это плохо держать только в голове модели или в
    Иллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOS
  • EasySwift iOS

    7 сент., 06:02

    Modern iOS Performance: Episode 2⚠️ Переход на Swift Concurrency и другие современные абстракции не делает приложение автоматически быстрее - они упрощают код, но могут невольно сериализовать параллельную работу, переместить тяжёлые вычисления на главный поток или скрыть расходы времени выполнения. Компилятор примет код, но это не гарантирует корректной модели конкуренции: важно явно понимать, кто запускает, отменяет и к какому состоянию имеет доступ асинхронная задача.⚙️ Автор разбирает расходы абстракций - протоколы, type-erasure, actors, AnyView/AnyPublisher и т.п. - особенно на «горячих» путях (скролл, рендер, частые обновления). Цель - не убрать абстракции, а понять, где их стоимость платится и действительно ли это критично. Отдельно - влияние статической и динамической линковки, менеджеров зависимостей и
  • EasySwift iOS

    5 сент., 06:04

    How Do You Build a Mutex That Works with async/await ?🔍 Автор столкнулся с задачей запретить одновременный запуск async метода и показал, почему ни actor, ни Mutex не подходят. Решение - библиотека TaskGate (AsyncGate и AsyncRecursiveGate): это асинхронный «турникет», который допускает только одну задачу внутрь и при этом безопасно позволяет await внутри секции.❓ Внутреннее состояние - два состояния (.unlocked и .locked(queue)) и простой NSLock для защиты этих маленьких синхронных обновлений. Первая задача просто «заходит» и оставляет дверь закрытой; последующие регистрируют свою continuation как билет в очередь и «паркуются» без блокировки потока. Когда владелец выходит, он не открывает ворота всем сразу, а передаёт продолжение следующему - handoff, честная FIFO-очередь, никакой толкучки.
  • EasySwift iOS

    2 сент., 08:04

    🧭 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 цене.
    Иллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOS
    6743111Открыть в Telegram
  • EasySwift iOS

    1 сент., 06:00

    Миллион частиц на iPhone: строим аттрактор Лоренца на GPU с Metal👀 Автор показывает практический эксперимент: симуляция аттрактора Лоренца на сотнях тысяч частиц полностью на GPU с помощью Metal - расчёт через вычисляемые шейдеры, ping‑pong буферы и рендер одного буфера как point primitives. Главное архитектурное решение простое и рабочее: состояние частиц живёт только на GPU, CPU лишь обновляет uniforms и кодирует команды.💡 Проходится весь путь от формулы и выбора интегратора (Euler, RK2, RK4) до деталей реализации: выравнивание структур между Swift и MSL, создание staging/двух приватных буферов, выбор размеров threadgroup, отрисовка точек, additive blending и избегание waitUntilCompleted.✏️ Что стоит забрать из статьи про работе с металом: ➡️ храни
  • EasySwift iOS

    28 авг., 06:00

    Private properties no longer break the memberwise initializer in Swift 6.4🆕 В Swift 6.4 изменили правило синтеза memberwise инициализатора для структур: теперь свойства, которые менее доступны, чем максимально возможный уровень доступа и при этом имеют значение по умолчанию, исключаются из синтезируемого инициализатора.❓ Что это значит на практике: если вы добавили приватное поле вроде cached id = UUID() с инициализацией, оно больше не «тянет вниз» доступность всего инициализатора — внешний код всё ещё может вызывать Post(title:…, body:…) без доступа к id. Компилятор сохраняет обратную совместимость: дополнительно синтезируется старый, более закрытый инициализатор, доступный в том же файле.❗️ Важно: ➡️ приватное свойство без значения по умолчанию всё
  • EasySwift iOS

    26 авг., 06:01

    WebRTC on iOS in 2026, without building a video callℹ️ WebRTC - это не просто видео фреймворк, это реально рабочий P2P канал с обходом NAT и низкой задержкой. Автор крутит одно соединение между узлами и пять каналов данных: touch (быстро, без гарантий доставки), terminal (строго порядок и надёжность) и ещё три для команд, уведомлений и потоков логов. Благодаря разделению на каналы, мегабайты логов не мешают срочной команде отмены сборки.Несколько полезных советов: ➡️ на каждую комнату должен приходиться один постоянный клиент сигналинга. Если будет несколько - будет дерганье: старый клиент кикает новый, новый кикает старый — вечная петля. ➡️ при временных проблемах сети делаем ICE‑restart - не рвём всю связь; если же сессию захватили с другого устройства (другой device id) - полное
  • EasySwift iOS

    24 авг., 06:00

    Как мы построили систему регрессионного UI-тестирования для iOS-приложения: XCUITest, mock backend и XcodeBuildMCP🖥 Статья описывает практическую архитектуру для масштабируемой UI-регрессии в зрелом iOS‑проекте. Вместо попыток заменить XCUITest авторы строят инфраструктуру вокруг него: роботы (Robot Pattern) инкапсулируют работу с интерфейсом, launch arguments управляют стартовым состоянием приложения, а собственный mock‑backend с профилями отвечает за детерминированные серверные ответы. Такой подход переводит единицу регрессии с отдельного теста на воспроизводимый сценарий: начальное состояние + конфигурация backend + действия пользователя + ожидаемый результат🔴 Важная часть - интеграция ИИ‑агента через XcodeBuildMCP, который автоматизирует рутинный поиск маршрутов и генерацию XCUITest на основе текстового сценария
  • EasySwift iOS

    22 авг., 06:03изменён

    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
  • EasySwift iOS

    19 авг., 06:00

    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, фон, мин/макс размеры, проценты или абсолютные величины
  • EasySwift iOS

    17 авг., 06:03

    Instruments Flame Graph Introduction🔍 Если вы не знали, что такое flame-граф в Time Profiler, то самое время узнать - откройте Call Tree и нажмите правую кнопку над деталями, чтобы включить граф. Если кнопки нет, выбранный инструмент это не поддерживает.❓ Flame‑граф это стопки прямоугольников, каждый - функция в стеке; ширина показывает, сколько времени функция была в стеке. Верхние строки - системные точки входа, ваши функции чаще ниже и отмечены синим. Самые «тяжёлые» вызовы находятся слева.ℹ️ Чтобы оставить только свой код включите Hide System Libraries в Call Tree; кликайте по прямоугольникам и двигайтесь стрелками; для чтения имён делайте зум: Option+клик и Option+прокрутка (или жест трекпада), Option+клик в пустом месте - вернуть масштаб.
    Иллюстрация к посту канала EasySwift iOSИллюстрация к посту канала EasySwift iOS
  • EasySwift iOS

    14 авг., 06:20

  • EasySwift iOS

    14 авг., 06:01

    Building Testable SwiftData Applications👀 В статье - как правильно тестировать SwiftData в iOS проектах, и главный акцент делает не на проверке самого фреймворка, а на защите бизнес логики. Для обычных юнит тестов лучше брать in-memory store, чтобы тесты были изолированными, быстрыми и не зависели друг от друга.⚠️ В статье хорошо показано, какие тесты почти не дают пользы: например, когда вы просто проверяете, что модель сохранилась и снова прочиталась из базы. Гораздо ценнее тестировать реальные правила приложения - запрет одинаковых названий бюджета, корректный расчёт расходов, остатка и других важных значений.⚙️ Отдельно автор показывает, что сложную логику лучше выносить из View в отдельные типы. Тогда код проще поддерживать, а тесты писать легче. В конце есть интересная мысль
  • EasySwift iOS

    12 авг., 06:02

    Picture-in-Picture в iOS: от запуска до переключения контента🔍 Статья - практичный гайд по PiP на iOS. Автор показывает, как запустить системное «плавающее окно», настроить жизненный цикл и переключать контент без разрывов. Главный посыл: PiP - сквозной системный механизм, который живёт в отдельном окне и требует правильной подготовки.Что обязательно проверить: ➡️ AVAudioSession настроен на .playback/.moviePlayback и активен - без этого PiP не стартует ➡️ В Capabilities включён Background Modes -> Audio, AirPlay, and Picture in Picture. ➡️ AVPictureInPictureController хранится в сильной ссылке, иначе ARC удалит его до отрисовкиКак жить с PiP в приложении: ➡️ Делегат нужен для восстановления интерфейса и очистки после
  • EasySwift iOS

    10 авг., 06:01

    Building a reusable API client with URLSession in Swift🔍 Очередной взгляд на то, как собрать лёгкий API‑клиент на базе URLSession и async/await. Выделяются общие шаги любых запросов, а именно: построение URLRequest, выполнение через URLSession, проверка HTTP ответа и декодирование JSON - и предлагает вынести их в одно место (APIClient) чтобы не дублировать код по проекту.Приводятся компактные типы: ➡️ Endpoint с путём ➡️ методом и заголовками ➡️ небольшая обработка ошибок (invalidResponse, invalidStatusCode) ➡️ методы для сборки запроса и отправки ➡️ пример декодирования модели🖥 Можно еще выделить в качестве полезных советов:
  • EasySwift iOS

    7 авг., 06:15

    An Even Closer Look at Protocols and Global Actors❓ Как лучше задавать изоляцию @MainActor для протоколов в Swift — всей протоколу, отдельным требованиям или вовсе не ставить атрибут?ℹ️ На примере протокола для показа ошибок автор сравнивает «whole‑protocol» (удобно и сокращает код, но раньше мешало конформить акторы) и «per‑requirement» (более гибко, явнее поведение).⚙️ Не вешайте @MainActor автоматически - сначала подумайте, где реально нужна синхронная работа с UI. Для внутренних API удобно использовать per‑requirement изоляцию, а для публичных или простых случаев можно сделать протокол не‑изолированным и перенести @MainActor на конкретные реализации. Особое внимание уделите параметрам (например, колбэкам) - им может понадобиться свой атрибут @MainActor или объявление как Sendable.