Swift 6: What’s New and How to Migrate
⚠️ Статья Antoine van der Lee
— гайд по апдейту проектов и пакетов под Swift 6. Акцент на настройке Xcode, обработке предупреждений и переходе на новую модель конкурентности.
⚙️ Подсветка ключевых параметров: включаем
➡️ Рекомендуется поэтапная миграция проектов, начиная с изолированных частей кода, с поэтапным включением новых функций и строгой проверки параллелизма.
💡 Не спешите, исправляйте предупреждения по мере их появления и открывайте запросы на изменения для небольших изменений, чтобы упростить процесс.
— гайд по апдейту проектов и пакетов под Swift 6. Акцент на настройке Xcode, обработке предупреждений и переходе на новую модель конкурентности.
-strict-concurrency=complete
и фиксим deprecated-методы. Автор советует не откладывать миграцию — Swift 6 ломает обратную совместимость в угоду безопасности.Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
@unknown default usage with enums in Swift
⚠️ Конструкция
❓ Когда использовать?
Если enum может расширяться без вашего контроля (например, серверные модели). Для своих enum хватит обычного
➡️
@unknown default
была введена в Swift 5 для работы с перечислениями и помогает подготовиться к будущим изменениям API от Apple.enum AppState: CaseIterable {
case active, background
@unknown default // На случай, если в Swift 6 добавят новый кейс
}
func handle(state: AppState) {
switch state {
case .active: print("App alive!")
case .background: print("App sleep...")
@unknown default: print("WARNING: New state detected!")
}
}
Если enum может расширяться без вашего контроля (например, серверные модели). Для своих enum хватит обычного
default
— иначе потеряете в читаемости.Frozen
перечисления никогда не получат новых случаев, в то время как non-frozen
перечисления требуют использования @unknown для обработки будущих случаев.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Creating ML models with Create ML
😮
➡️ Сам
❗️ Качество набора данных критично для успешного обучения модели - иначе модель выдаст «мусор на выходе»; можно использовать методы увеличения данных для улучшения результатов. После обучения можно просмотреть результаты точности модели и протестировать её на примерах текста.
Краткий вывод:
✔️ Если нужно быстро внедрить ML в приложение без сложных кастомных моделей -
Create ML
— это инструмент для создания моделей машинного обучения без необходимости написания кода, доступный в Xcode. Интерфейс вместо тысячи строк кода: классификация изображений, текста или тайм-серий. В статье приведены советы по импорту данных и оценке точности без танцев с Python. CreateML
поддерживает различные алгоритмы, включая BERT, который подходит для многоязычных моделей и улучшает понимание контекста.Краткий вывод:
CreateML
отличное решение. Для глубоких экспериментов — всё же используйте более специализированные инструменты.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Using Critical Alerts in iOS applications
Если вы не знал про
⚠️
🖥 Для использования
➡️ При запросе разрешений на уведомления необходимо добавить опцию .
🔈 Для отправки
⚙️ С помощью расширения службы уведомлений можно изменить входящие уведомления на критические, изменив свойство
🚨 Но обращаю внимание: Нужно обосновать необходимость применения таких алертов в личном кабинете разработчика.
Если вы не знал про
Critical Alerts
в iOS - советую ознакомиться. Critical Alerts
в iOS показываются пользователю даже в беззвучном режиме или режиме Не беспокоить
, что делает их очень заметными. Фишка для медприложений, систем безопасности или экстренных оповещений. Critical Alert
необходимо получить специальные разрешения от Apple через портал разработчиков, добавив ключ com.apple.developer.usernotifications.critical-alerts
в файл entitlements.criticalAlert
, чтобы пользователь мог отдельно разрешить или запретить критические уведомления.Critical Alert
необходимо изменить payload, указав звук как критический в формате словаря.sound
в UNMutableNotificationContent
.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍2
iOS app setup for remote push notifications
Статья - пошаговый гайд для разработчиков, которые хотят добавить remote push в своё приложение. Вот ключевые моменты:
🖥 Нужно активировать Push-уведомления в настройках App ID и создать специальный сертификат (APNs key). 🔑 Без активного аккаунта разработчика — никак!
⚙️ Добавляем capability
➡️ Запрос на показ уведомлений лучше делать после действия пользователя (например, на кнопку Разрешить). Код на Swift с
✏️ После регистрации получаем токен, конвертируем его в строку и шлём на бекенд. Автор даёт код для обработки в AppDelegate.
✉️ Советуют использовать Push Notifications Console от Apple — можно отправить тестовый пуш, вставив токен устройства. Если всё настроено верно, уведомление придёт даже когда приложение свёрнуто.
Статья - пошаговый гайд для разработчиков, которые хотят добавить remote push в своё приложение. Вот ключевые моменты:
Push Notifications
в проект. Для SwiftUI-приложений понадобится AppDelegate
— автор показывает, как прикрутить его через UIApplicationDelegateAdaptor
.UNUserNotificationCenter
— в статье есть пример асинхронного запроса прав.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
Using UIKit's New UITab Class with Sidebar on iOS 18
➕ В iOS 18 добавлен новый класс
Вот несколько шагов для достижения результат, как в анимации:
➡️ Создайте
➡️ Реализуйте
UITab
для управления вкладками и боковыми панелями, что упрощает создание интерфейсов с использованием UIKit
.Вот несколько шагов для достижения результат, как в анимации:
UITabBarController
и добавьте массив объектов UITab
, включая UISearchTab
для поиска, чтобы улучшить навигацию в приложении. Вы можете переключаться между традиционной вкладкой и боковой панелью, изменяя свойство mode у UITabBarController
, что позволяет гибко настраивать интерфейс.UITabBarControllerDelegate
для обработки drag-and-drop, что улучшает пользовательский опыт.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤1
How to Clean Xcode Junk and Reclaim Valuable Disk Space on Your Mac
🖥 Xcode занимает много места из-за файлов сборки, данных индексации, символов отладки, файлов симулятора и кэшей, которые необходимы для оптимизации работы.
🟢 Удаление данных, полученных в процессе сборки, можно выполнить через терминал или Finder, что может освободить значительное пространство на диске.
🟢 Архивы могут занимать много места; важно сохранять только те, которые необходимы для отправки в App Store или важные версии релизов.
🟢 Регулярная очистка кэшей и управление симуляторами через терминал или Xcode поможет поддерживать оптимальную производительность и освободить место на диске.
🟢 Рекомендуется удалять только старые версии iOS, которые больше не поддерживаются, чтобы избежать повторной загрузки актуальных файлов при подключении устройств.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
What is Structured Concurrency?
❓
✔️ С помощью SC задачи создаются и ожидаются в четком порядке, ошибки автоматически передаются, что упрощает обработку ошибок и делает код более читаемым.
⚠️ Неупорядоченные задачи существуют, но они требуют ручного управления отменой и могут привести к проблемам, таким как гонки данных, поэтому рекомендуется использовать структурированные задачи.
Structures Concurrency (SC)
— это модель, которая упрощает чтение, поддержку и понимание асинхронного кода в Swift, устраняя проблемы, связанные с callback hell
.func fetchData() async throws -> String {
try await Task.sleep(for: .seconds(1)) // Simulating network delay
return "Data"
}
func loadData() async throws {
let data1 = try await fetchData()
let data2 = try await fetchData()
let data3 = try await fetchData()
print("Finished loading: \(data1), \(data2), \(data3)")
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Формализация принципа Open/Closed: как сохранить обратную совместимость с помощью SOLID
❓ Система должна быть открыта для расширения, но закрыта для изменения, что позволяет сохранять обратную совместимость при разработке.
✏️ СемВер используется для управления версиями, где мажорные изменения требуют правок у клиентов, а минорные и патч-версии могут добавлять функционал без нарушения совместимости.
⚠️ Частые нарушения включают добавление обязательных методов в протоколы и изменение публичных интерфейсов, что требует повышения мажорной версии.
⚙️ Решения для обратной совместимости включают использование расширений протоколов, создание новых протоколов или добавление опциональных методов для сохранения совместимости.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Result builders in Swift
❓ С помощью аннотации
⚙️ Такие конструкторы могут поддерживать условия и циклы, что позволяет создавать более сложные конструкции, такие как условные предложения и массивы строк.
⏩ Swift 5.4 расширяет функциональность конструкторов результатов, позволяя использовать их в пользовательских представлениях SwiftUI, что упрощает создание интерфейсов.
🔗 Работать может не только со строками, но и с разными типами данных.
@resultBuilder
можно создавать функции, которые автоматически объединяют строки без необходимости добавления запятых. @resultBuilder
struct ValidatorBuilder {
static func buildBlock(_ components: Bool...) -> Bool {
components.allSatisfy { $0 }
}
}
func validate(@ValidatorBuilder _ rules: () -> Bool) -> Bool {
rules()
}
let email = "[email protected]"
let isValid = validate {
email.count >= 5
email.contains("@")
!email.hasSuffix(" ")
}
print(isValid)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Yielding and debouncing in Swift Concurrency
ℹ️ Функция
⌛ Дебаунсинг позволяет игнорировать промежуточные данные при вводе пользователем, начиная выполнение задачи только после того, как данные остаются неизменными в течение определенного времени.
🔴 Swift использует модель кооперативного отмены задач, что позволяет отменять предыдущие задачи при вводе новых данных, не останавливая их принудительно.
yield
позволяет приостановить выполнение задачи и вернуть поток в пул для выполнения других асинхронных задач, что помогает избежать блокировки потоков в пуле.struct DataHandler {
func process(json files: [Data]) async throws -> [Item] {
let decoder = JSONDecoder()
var result: [Item] = []
for file in files {
let items = try decoder.decode([Item].self, from: file)
result.append(contentsOf: items)
await Task.yield()
}
return result
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Performing your app actions with Siri through App Shortcuts Provider
Интеграция Siri с действиями приложения позволяет пользователям выполнять команды голосом, что упрощает взаимодействие в ситуациях, когда руки заняты.
⏩ В статье взаимодействие с Siri происходит в
➕ Создание ярлыков для Siri включает добавление фраз, которые позволяют пользователю открывать книги с помощью голосовых команд, улучшая пользовательский опыт.
🟢 Метод
🖥 Добавление альтернативных названий приложения и параметров сущностей позволяет пользователям взаимодействовать с приложением более эффективно и интуитивно.
Интеграция Siri с действиями приложения позволяет пользователям выполнять команды голосом, что упрощает взаимодействие в ситуациях, когда руки заняты.
BooksShelfAskSiri-Starter
- приложение для управления библиотекой книг, включая функции для добавления, просмотра и открытия книг.updateAppShortcutParameters()
обновляет параметры ярлыков каждый раз, когда добавляется или удаляется книга, обеспечивая актуальность команд.import AppIntents
struct BookShelfShortcutsProvider: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: OpenBookIntent(),
phrases: [
"Open a book in \(.applicationName)"
],
shortTitle: "Open a book",
systemImageName: "book"
)
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
Don't rely on BGAppRefreshTask for your app's business logic
⚙️ Использование BGAppRefreshTask для бизнес-логики приложения не гарантирует выполнение фоновых задач, что может привести к устаревшим данным.
⚠️ Автор столкнулся с проблемами после выпуска приложения, когда фоновая задача не выполнялась, несмотря на успешные тесты в TestFlight.
➡️ Вместо фоновых задач автор теперь обновляет данные при каждом открытии приложения, что не идеально для пользователей виджетов.
✔️ Для надежного обновления данных лучше использовать фоновые уведомления, отправляемые с сервера через APNs, хотя это требует наличия бэкенда.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Strategies to avoid merge conflicts in Xcode Projects
Статья про борьбу с конфликтами в XCode проектах, которые возникают из-за частых изменений в файле
Выделяют несколько вариантов решения:
⏩ Разделение проектов
Организация рабочего пространства в несколько проектов может снизить количество конфликтов, распределяя зависимости, хотя это может немного увеличить время индексации и сборки в Xcode.
⏩ Генерация проектов
Использование инструментов, таких как
⏩ Использование SPM
⏩ Фича XCode 16
В Xcode 16 были введены синхронизированные группы, которые позволяют Xcode автоматически синхронизировать файлы в папке, что упрощает управление проектом и снижает вероятность ошибок.
🖥 Я, в основном, пользовался генерацией. Делитесь своим опытом в голосовании.
Статья про борьбу с конфликтами в XCode проектах, которые возникают из-за частых изменений в файле
project.pbxproj
, который не предназначен для прямого редактирования и обновляется при добавлении, удалении или перемещении файлов.Выделяют несколько вариантов решения:
Организация рабочего пространства в несколько проектов может снизить количество конфликтов, распределяя зависимости, хотя это может немного увеличить время индексации и сборки в Xcode.
Использование инструментов, таких как
Tuist
и XcodeGen
, позволяет определять проекты с помощью языков, таких как Swift или YAML, что снижает вероятность конфликтов за счет использования шаблонов.Swift Package Manager
, изначально инструмент для управления зависимостями, стал популярным менеджером проектов, позволяя использовать шаблоны для снижения конфликтов, но может замедлять работу Xcode.В Xcode 16 были введены синхронизированные группы, которые позволяют Xcode автоматически синхронизировать файлы в папке, что упрощает управление проектом и снижает вероятность ошибок.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Как вы решаете конфликты в XCode проектах?
Anonymous Poll
14%
Разделение проектов
56%
Генерация проекта
16%
SPM
15%
Фича из XCode 16
Making your own custom Optional
❓ В статье описывается, как создать собственный тип
⚠️ Представлен метод
Кстати, статья в разделе Интревью🙂
Optional
в Swift, используя перечисление с двумя случаями: наличие значения и отсутствие (nil)
unwrapped()
, который выбрасывает ошибку, если значение отсутствует, с использованием пользовательского перечисления ошибок CustomOptionalError
.Кстати, статья в разделе Интревью
enum CustomOptional<T> {
case some(T)
case none
var value: T? {
switch self {
case .some(let value):
return value
case .none:
return nil
}
}
func unwrapped() throws -> T {
switch self {
case .some(let value):
return value
case .none:
throw CustomOptionalError.valueIsNil
}
}
// MARK: - Custom Optional Error enum
enum CustomOptionalError: Error {
case valueIsNil
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Factory for DI
Отличная статья про реализацию DI.
Автор проводит сравнение трех подходов:
- паттерн фабрика
-
-
⚙️ Паттерн Фабрики используется для создания объектов, инкапсулируя логику создания в отдельном классе или методе, что способствует поддержанию принципа единственной ответственности. Для крупных проектов использование фабрик может быть недостаточным, так как они не обеспечивают управление жизненным циклом зависимостей и не позволяют легко заменять реализации для тестирования.
ℹ️ Библиотека
🟢 В отличие от
Отличная статья про реализацию DI.
Автор проводит сравнение трех подходов:
- паттерн фабрика
-
Factory
библиотека-
Swinject
Factory
предлагает расширенные возможности для DI, включая управление жизненным циклом, легкость в тестировании и обнаружение циклов зависимостей.Swinject
, библиотека Factory
обеспечивает безопасность на этапе компиляции, что предотвращает ошибки во время выполнения, связанные с незарегистрированными зависимостями.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3👎3😁1
Profiling apps using Instruments
‼️ Apple выпустили хороший курс по работе с инструментами профилирования.
💡 Весь курс направлен на поиск и устранение зависаний, анализ синхронных и асинхронных работ, разгрузку главного потока.
Сам курс рассчитан на 1 час 35 минут.
Если еще не смотрели - то сейчас самое время🔍
Сам курс рассчитан на 1 час 35 минут.
Если еще не смотрели - то сейчас самое время
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍4