Спасибо всем кто смотрел вместе с нами на стриме, первый опыт, пишите в комментарии зашел ли вам такой формат, хочется ли трансляции других ивентов?
AirPods Pro 3
Apple Watch 11
iPhone 17
iPhone Air
iPhone Pro
Как вам новинки? 👍 / 🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔18👍7🔥4❤1
Набор советов по дебагу iOS приложений
Название достаточно громкое, "Я потратил 5 лет на неправильный дебаг, вот как нужно". Но советы действительно полезные:
Не эффективно:
🔴 Множество print-ов для отладки
🔘 Разделяю мнение автора. Но все таки полезно сделать нормальное логирование, а ситуационные print-ы так себе подход
🔴 Закомментировать все и постепенно раскомментировать
🔘 Точно не лучший способ, сколько раз из-за багов Xcode компиляции я думал что все исправил
🔴 Магические константы
🔘 Примеры в статье странные, я бы обозначил это так: не чините баги с помощью
Что эффективно:
🟢 Conditional Breakpoints.
Эффективно но сложно в настройке, применял только в самых сложных сценариях
🟢 LLDB команды для терминала.
🟢 Debug View Hierarchy - очень полезно, когда работает
🟢 Включайте точки остановки при runtime ошибках
Что еще использую лично я?
🔵 Proxy для моккирования сети
🔵 Выстраивание архитектуры через UDF
🔵 Логирование переходов из состояния в состояние
🔵 Автотесты для воспроизведения ошибочного сценария
🔵 Форматирование контента логируемых объектов (
Название достаточно громкое, "Я потратил 5 лет на неправильный дебаг, вот как нужно". Но советы действительно полезные:
Не эффективно:
Dispatch.asyncAfter
Что эффективно:
Эффективно но сложно в настройке, применял только в самых сложных сценариях
po, expr, image, thread, frame
Что еще использую лично я?
debugDescription
)Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🤔1
Превращение журналов CI в действия
В обзоре дебага я немного коснулся логирования. Но логирование нужно не только для для отлаживания багов, но для CI. Просмотр журналов CI при падении утомителен и неэффективен. Использование скриптов для комментариев и оповещений дублирует логику. Разберемся как использовать специальные строки журнала и оболочку для автоматизации действий.
Пример с Xcode
🔵 Xcode использует специальные журналы для отображения предупреждений.
🔵 Можно создать исполняемый файл, который будет анализировать журналы и выполнять действия.
Реализация на Swift
🔵 Используется подпроцесс для выполнения команды сборки и анализа журналов.
🔵 Подпроцесс удаляет первый аргумент и гарантирует прозрачность
🔵 Вывод стандартного вывода анализируется и обрабатывается.
Добавление комментариев к PR
🔵 Лог-коммандер получает переменные окружения для авторизации на GitHub.
🔵 Создается клиент GitHubClient для публикации комментариев.
🔵 Лог-коммандер анализирует строки журнала в формате JSON и публикует комментарии.
Манипуляция средой
🔵 Дочерний процесс не должен знать об авторизации на GitHub.
🔵 Среда манипулируется в исходном вызове run для удаления переменной
Преимущества и расширение
🟢 Единая оболочка упрощает процесс отладки и уменьшает дублирование логики.
🟢 Можно расширить функциональность для создания оповещений Slack, метрик и других действий.
В обзоре дебага я немного коснулся логирования. Но логирование нужно не только для для отлаживания багов, но для CI. Просмотр журналов CI при падении утомителен и неэффективен. Использование скриптов для комментариев и оповещений дублирует логику. Разберемся как использовать специальные строки журнала и оболочку для автоматизации действий.
Пример с Xcode
Реализация на Swift
stderr
.Добавление комментариев к PR
Манипуляция средой
GITHUB_TOKEN
.Преимущества и расширение
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Apple представила новый SwiftUI WebView для отображения веб-контента. Веб-просмотр доступен для iOS 26, macOS 26 и других версий. Одна из немногих фич, которую точно стоит прикручивать с бекпортом сразу при релизе. Веб-просмотр является частью фреймворка WebKit, отличий в рендеринге не будет, а вот API сильно приятнее.
Два подхода к отображению веб-контента
Простая загрузка по URL-адресу
Усовершенствованный контроль с помощью WebPage
Преимущества WebView
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Пока все радуются iOS 26, давайте вспомним, что же нам стало доступно вместе с релизом Swift 6.2.
Approachable Concurrency
Swift 6.2 упрощает параллельное программирование:
@MainActor
async
функции: можно писать асинхронный код без доступа к мутации состояния@concurrent
Safe Systems Programming
Новые фичи по написанию низкоуровневого быстрого кода безопасно:
unsafe pointer
Swift расширение для VS Code официально в релизе:
Точный контроль над "ворнингами"
Предупреждениями компилятора теперь можно гранулярно управлять через установку
diagnostic group
идентифицируемой именем. Например, теперь можно выставить "считать все предупреждения ошибками" кроме предупреждений о депрекейтах API..target(
name: "MyLibrary",
swiftSettings: [
.treatAllWarnings(as: .error),
.treatWarning("DeprecatedDeclaration", as: .warning),
]
)
Улучшили дебаг многопоточки:
Подпроцесс
В Swift 6.2 представлен новый пакет
Subprocess
с оптимизированным API для запуска внешних процессов и управления ими. import Subprocess
let swiftPath = FilePath("/usr/bin/swift")
let result = try await run(
.path(swiftPath),
arguments: ["--version"]
)
let swiftVersion = result.standardOutput
Foundation
Библиотека Foundation включает современный NotificationCenter API, который использует конкретные типы уведомлений вместо строк и нетипизированных словарей. Типы уведомлений также указывают, отправляются ли они синхронно на основной актор или асинхронно через соответствие
MainActorMessage
или AsyncMessage
.Observation
Swift 6.2 позволяет транслировать изменения состояния наблюдаемых типов в рамках транзакций с помощью нового типа асинхронной последовательности
Observations
. Это позволяет избежать избыточных обновлений пользовательского интерфейса, повышает производительность и гарантирует, что ваш код будет реагировать на согласованный снапшот изменения.Тестирование
Новые API для повышения выразительности тестов и результатов тестирования.
-@Test("square() returns x * x")
-func squareIsXTimesX() {
+@Test func `square() returns x * x`() {
#expect(square(4) == 4 * 4)
}
Поддержка WebAssembly
Swift 6.2 получил поддержку WebAssembly, также известной как Wasm. WebAssembly — это платформа виртуальных машин, ориентированная на переносимость, безопасность и высокую производительность. Вы можете создавать как клиентские, так и серверные приложения для Wasm и развертывать их в браузере или на других платформах. Узнайте больше о Wasm в обзоре поддержки WebAssembly в Swift.
Что из этого вы больше всего ждали?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2
Фичефлаги - простая пятничная тема на обсудидить. Флаги позволяют включать и выключать определенные функциональные возможности в зависимости от условий. Если вы используете trunk-based подход, то вы точно активно пользуетесь фичефлагами. В статье разбирается базовая реализация фичефлагов, которую можно значительно улучшить. Что бы я заложил, если передо мной стояла задача реализовать фичефлаги в новом приложении:
Вы используете фичефлаги в своем прилоежнии? Если да, то что бы вы еще отметили? Если нет, то почему?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
Навалим немного базы:
[weak self]
используется для предотвращения утечек памяти в замыканиях. В обработчиках завершения [weak self]
и guard let self
используются для проверки существования self перед продолжением выполнения. Но SE-0269 позволяет использовать неявные self-захваты в ситуациях, когда замыкания не сохраняются, что снижает вероятность утечек памяти.Проблемы с [weak self] в Task
Предотвращение утечек памяти в Task
Рекомендации по использованию [weak self] в Task:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤔2
Я помогаю с подготовками статей и это официально самая сложная из них, как в плане материала, так и по доработке подачи. Постарался помочь найти баланс между хардкором и капитаном очевидностью. Комментариев не много, так что либо все понятно, либо вообще ничего не понятно.
Суть рассказа - метод
swift_conformsToProtocolMaybeInstantiateSuperclasses
который значительно замедляет запуск приложения, а используется повсеместно - as?
, as!
, String(describing:)
и String(reflecting:)
.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3
Неустаревающая классика, ручное и автоматическое завершение задач в Swift, сколько провожу собесы, столько разработчики валятся на этом вопросе. Если с NSOperations и GCD еще были нюансы, то в Swift Concurrency, мне казалось, все очевидно. База:
Использование модификатора
.task
.task
запускается при появлении View и отменяется при его исчезновении.Повторение работы с модификатором
.task(id:)
.task(id:)
запускается при появлении представления и повторяется при изменении идентификатора.Проверка отмены в коде
try
или Task.checkCancellation()
.Долгоживущие задачи
DataService
.Ручная отмена задач
task.cancel()
для ручной отмены.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM