EasySwift iOS🍏
3.03K subscribers
269 photos
8 videos
394 links
Все самое интересное в мире iOS разработки 🧑🏻‍💻

Предложить статью или новость: @EasySwiftBot

По всем вопросам обращаться к @itereznikov
Download Telegram
XCTest Meets @MainActor: How to Fix Strict Concurrency Warnings

Если вы попробовали поддержать Swift 6 в своем проекте, то в тестах у вас могла произойти картина, схожая со скриншотом - куча ворнингов, которые станут ошибками в Swift 6.

Тут есть несколько вариантов решения:

💡 Для устранения предупреждений можно пометить класс тестов как @MainActor, что позволяет избежать ошибок, связанных с различиями в изоляции актора.

⚙️ Можно также попробовать использовать асинхронные версии методов setUp и tearDown, чтобы избежать предупреждений о синхронном контексте.

➡️ Альтернативно - старайтесь избегать использования setUp и tearDown, создавая объекты непосредственно в тестах, или перейти на Swift Testing для лучшей совместимости с актерами.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥42
Model Inheritance in Core Data

🔗 Core Data позволяет разработчикам использовать модель наследования, что упрощает создание и управление данными, позволяя подчинённым сущностям наследовать свойства родительской сущности.

🟢 Модель наследования упрощает декларации моделей, поддерживает агрегированные запросы и улучшает гибкость в моделировании отношений между различными подтипами сущностей.

⚠️ Несмотря на преимущества, такая модель может привести к избыточности данных и снижению производительности при работе с большими объемами данных.

📌 Рекомендуется осторожно использовать модель наследования и рассмотреть возможность ручной реализации аналогичных эффектов для лучшей совместимости с SwiftData.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Getting started with Core Image

Core Image — это мощный фреймворк для обработки и анализа изображений, разработанный Apple, который позволяет разработчикам применять фильтры и выполнять сложные манипуляции с изображениями в реальном времени.

➡️ Фреймворк состоит из трех основных компонентов: CIImage (представляет данные изображения), CIFilter (применяет эффекты) и CIContext (управляет рендерингом изображений).

🖥 Core Image предлагает широкий набор встроенных фильтров, которые можно комбинировать для создания сложных эффектов, а также возможность создания пользовательских фильтров с использованием языка Core Image Kernel или Metal.

⚙️ Фреймворк использует аппаратное ускорение через GPU для высокопроизводительных задач, что позволяет обрабатывать изображения быстро и эффективно, особенно в приложениях, требующих реального времени.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
How combine lists of Strings into natural and localized sentences in Swift

✏️ Класс ListFormatter позволяет объединять списки строк в читаемые предложения, учитывая локализацию пользователя.


// Используя joined
let languages = ["Swift", "Kotlin", "Rust"]

let joinedLanguages = languages.dropLast().joined(separator: ", ")
+ (languages.count > 1 ? " and " : "")
+ (languages.last ?? "")
// "Swift, Kotlin and Rust"

// Используя ListFormatter

let listFormatter = ListFormatter()
// "Swift, Kotlin, and Rust"
listFormatter.string(from: ["Swift", "Kotlin", "Rust"])


💡 Метод string(from:) класса ListFormatter преобразует массив элементов в строку, учитывая локаль, например, 'Swift, Kotlin y Rust' для испанского языка.

let listFormatter = ListFormatter()
listFormatter.locale = Locale(identifier: "es-ES")
// "Swift, Kotlin y Rust"
listFormatter.string(from: ["Swift", "Kotlin", "Rust"])


😮 ListFormatter может работать не только со строками, но и с любыми типами, которые могут быть представлены как строки, при этом пользовательские типы должны соответствовать протоколу CustomStringConvertible.

✔️ Метод formatted на массиве строк предлагает более лаконичный способ форматирования списков с дополнительными параметрами, такими как тип соединения (например, 'или' или 'и').
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Network Link Conditioner: Simulating Slow Networking

👀 Если вы не знали как тестировать состояния сетевого соединения, то эта статья для вас.

Network Link Conditioner позволяет тестировать приложения в условиях медленной сети на macOS и iOS, предлагая профили, такие как 3G и Edge.

⚙️ На iOS Network Link Conditioner доступен в разделе инструментов разработчика в настройках, где можно выбрать предустановленный профиль или создать свой.

⚙️ Чтобы установить Network Link Conditioner на macOS, необходимо загрузить дополнительные инструменты для Xcode через меню Xcode и найти его в папке Hardware.

➡️ Тестирование приложений в условиях медленной сети критически важно для обеспечения хорошего пользовательского опыта, особенно для пользователей с низкой скоростью интернета.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Потоки под капотом: как работают многопоточность и синхронизация в iOS

Если хотели разобраться в многопоточности - статья для вас - все достаточно хорошо и понятно написано.

Ниже приведу пару тезисов.

🕯 Конкурентность подразумевает чередование выполнения задач, в то время как параллелизм требует наличия нескольких процессорных ядер для одновременного выполнения задач.

ℹ️ Процесс — это экземпляр запущенной программы, который может содержать несколько потоков, выполняющихся в одном адресном пространстве, что позволяет эффективно управлять ресурсами.

⚙️ iOS предлагает инструменты, такие как GCD и Swift Concurrency, для управления потоками и задачами, обеспечивая оптимальное распределение ресурсов и упрощая разработку многопоточных приложений.

📊 Закон Амдала описывает, что ускорение программы, достигнутое за счет параллельной обработки, ограничено последовательными участками кода, которые не могут быть распараллелены.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
How to create and upload high-quality App Store assets with RocketSim and Helm

👀 Недавно вспоминали RocketSim. Держите статью, про упрощение создания качественных изображений для AppeSrore.

💡 RocketSim предлагает инструменты для создания оптимизированных скриншотов и видео-превью, что помогает выделить уникальные функции вашего приложения.

⭐️ Helm автоматизирует загрузку скриншотов, позволяя перетаскивать их из Finder и автоматически сортируя по устройствам и языкам.

➡️ Поддержка загрузки видео-превью в Helm запланирована на будущее.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Introducing gRPC Swift 2

🔝 gRPC Swift 2: Что нового и зачем это нужно?
Вышла вторая версия gRPC Swift — теперь с нативной поддержкой async/await и глубокой интеграцией в SwiftNIO. Это делает асинхронные RPC-вызовы проще, а код — чище, без ада с коллбэками.

⚡️ gRPC Swift 2 поддерживает все фичи протокола: от стримов до метаданных, плюс кодогенерация из .proto-файлов. Включает в себя умные функции клиента, такие как балансировка нагрузки, механизм разрешения имен и автоматические повторные попытки.

⚙️ gRPC Swift 2 распределен как набор пакетов, позволяя разработчикам выбирать только те компоненты, которые им необходимы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Swift 6: What’s New and How to Migrate

⚠️ Статья Antoine van der Lee
— гайд по апдейту проектов и пакетов под 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

⚠️ Конструкция @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

😮 Create ML — это инструмент для создания моделей машинного обучения без необходимости написания кода, доступный в Xcode. Интерфейс вместо тысячи строк кода: классификация изображений, текста или тайм-серий. В статье приведены советы по импорту данных и оценке точности без танцев с Python.

➡️ Сам CreateML поддерживает различные алгоритмы, включая BERT, который подходит для многоязычных моделей и улучшает понимание контекста.

❗️ Качество набора данных критично для успешного обучения модели - иначе модель выдаст «мусор на выходе»; можно использовать методы увеличения данных для улучшения результатов. После обучения можно просмотреть результаты точности модели и протестировать её на примерах текста.

Краткий вывод:

✔️ Если нужно быстро внедрить ML в приложение без сложных кастомных моделей - 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 Push Notifications в проект. Для SwiftUI-приложений понадобится AppDelegate — автор показывает, как прикрутить его через UIApplicationDelegateAdaptor.

➡️ Запрос на показ уведомлений лучше делать после действия пользователя (например, на кнопку Разрешить). Код на Swift с UNUserNotificationCenter — в статье есть пример асинхронного запроса прав.

✏️ После регистрации получаем токен, конвертируем его в строку и шлём на бекенд. Автор даёт код для обработки в AppDelegate.

✉️ Советуют использовать Push Notifications Console от Apple — можно отправить тестовый пуш, вставив токен устройства. Если всё настроено верно, уведомление придёт даже когда приложение свёрнуто.
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
🔥61
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?

Structures Concurrency (SC) — это модель, которая упрощает чтение, поддержку и понимание асинхронного кода в Swift, устраняя проблемы, связанные с callback hell.

✔️ С помощью SC задачи создаются и ожидаются в четком порядке, ошибки автоматически передаются, что упрощает обработку ошибок и делает код более читаемым.

⚠️ Неупорядоченные задачи существуют, но они требуют ручного управления отменой и могут привести к проблемам, таким как гонки данных, поэтому рекомендуется использовать структурированные задачи.

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