How to use the @available attribute in Swift
⚠️ Атрибут
✏️ Первый аргумент указывает платформу, а остальные могут включать
⚙️ Для выполнения кода на старых версиях можно использовать проверку
ℹ️ Если используется только аргумент
@available
позволяет определять доступность функций и типов на конкретных платформах или версиях Swift, что полезно при устаревании API или изменении методов.unavailable
, introduced, deprecated, obsoleted, message
и renamed
для управления доступностью кода.if #available
, чтобы условно выполнять код в зависимости от версии платформы.introduced
, можно применять сокращенный синтаксис, что упрощает запись атрибутов доступности.if #available(iOS 17.0, *) {
// Content is available here
} else {
// Fallback to some other code
}
@available(swift 5.10)
@available(iOS 17.0)
struct Content {
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
Streaming changes with Observations
Вы до сих пор используете Combine? Тогда мы идем к вам 🫵
Ну а если без шуток - речь про фреймворк Observation, который, по сути, заменяет Combine.
👀 Тип
🔗 Этот тип группирует обновления, что позволяет избежать избыточных эмиссий при изменении нескольких свойств одновременно.
⚙️ Автор представляет расширение для протокола
Вы до сих пор используете Combine? Тогда мы идем к вам 🫵
Ну а если без шуток - речь про фреймворк Observation, который, по сути, заменяет Combine.
Observations
соответствует протоколу AsyncSequence
, что позволяет использовать его в асинхронных циклах for-await
, упрощая работу с изменениями состояния.Observable
, позволяющее легко создавать асинхронные последовательности для определенных ключевых путей.extension Observable {
func stream<Value: Sendable>(
of keyPath: KeyPath<Self, Value>
) -> any AsyncSequence<Value, Never> {
Observations {
self[keyPath: keyPath]
}
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Swift 6: Sendable, @unchecked Sendable, @Sendable, sending and nonsending
Прочитав заголовок, кто-то может задаться вопросом: wtf?😐
Но это реалии Swift 6. А в статье автор пытается разобраться со всем этим - в конце даже отличная таблица сравнение.
Вот несколько моментов:
➡️
➡️
➡️
➡️
➡️
Прочитав заголовок, кто-то может задаться вопросом: wtf?
Но это реалии Swift 6. А в статье автор пытается разобраться со всем этим - в конце даже отличная таблица сравнение.
Вот несколько моментов:
Sendable
— это протокол, который позволяет компилятору проверять, может ли тип безопасно передаваться между изоляционными доменами, с автоматическим выводом соответствия для простых типов. @unchecked Sendable -
Используется для типов, безопасность которых была обеспечена другими механизмами, позволяя разработчикам обойти проверки компилятора, но требует осторожности, чтобы не злоупотреблять этой возможностью.@Sendable -
для замыканий указывает, что замыкание может безопасно передаваться между изоляционными доменами, с проверкой безопасности на этапе компиляции.sending -
позволяет передавать объекты без проверки на Sendable
, но гарантирует, что переданный объект не будет использоваться повторно после передачи.nonsending
- используется с nonisolated
для указания, что асинхронный метод должен наследовать изоляцию вызывающего контекста, а не выходить за его пределы.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
Default Actor Isolation: New Problems from Good Intentions
🆕 Swift 6.2 приносит долгожданное улучшение —
Основные идеи и эффекты нового механизма:
➡️ До Swift 6.2 неаннотированный код считался nonisolated, что приводило к множеству предупреждений и ошибок при строгой проверке конкурентности, особенно когда код на самом деле всегда выполнялся на главном потоке.
➡️
➡️ В Xcode 26 новые проекты получают эту настройку по умолчанию, а для старых нужно включать ее вручную в настройках компилятора или в Swift Package Manager через
➡️
➡️ Важно аккуратно использовать nonisolated и
❓ Новый подход снижает шум ошибок при миграции на Swift 6 и стимулирует более корректное использование модульного дизайна и конкурентного программирования.
Default Actor Isolation
, которое меняет подход к конкурентности в Swift. Теперь по умолчанию весь код таргета изолируется на @MainActor
, если явно не указано иное. Это снижает количество boilerplate-кода с аннотациями @MainActor
и Sendable
, упрощая жизнь разработчикам в UI-ориентированных проектах.Основные идеи и эффекты нового механизма:
Default Actor Isolation
меняет это поведение: теперь такой код автоматически считается изолированным на @MainActor
.defaultIsolation(MainActor.self)
nonisolated
сохраняется как способ явного выхода из изоляции, но меняет семантику — асинхронные nonisolated
функции уже не “сбрасывают” изоляцию, а наследуют ее от вызывающего контекста. @concurrent
, особенно в сложных многопоточных сценариях.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
What's New in UIKit
Принес вам супер лонг рид про нововведение в UIKit в 26 iOS. 64 минуты на чтение - самое то на выходных🍷
Вот основные моменты и темы, освещённые в статье:
➡️ Обновления
➡️ Новые визуальные эффекты и компоненты: введён новый класс
➡️ Поддержка HDR-цветов: в
➡️ Расширена система меню с новыми методами для тонкой настройки главного меню iPadOS и контекстных меню, а также поддержкой фокусного выбора меню.
➡️ новые свойства для
➡️ новый класс
Принес вам супер лонг рид про нововведение в UIKit в 26 iOS. 64 минуты на чтение - самое то на выходных
Вот основные моменты и темы, освещённые в статье:
UIAction
и UIApplicationDelegate
: добавлены новые идентификаторы действий и происходит постепенный отход от UIApplicationDelegate
в пользу более современных UISceneDelegate
и UIWindowSceneDelegate
UIGlassEffect
с эффектами Liquid Glass
, новые API для сглаживания углов в виде UICornerConfiguration
и UICornerRadius
. Также есть новые опции для кнопок (UIButton.Configuration
и элементов навигационной панели UIBarButtonItem
, включая новые стили, бейджи иконок и поведение.UIColor
и связанных компонентах появляются конструкторы и свойства для работы с HDR, а в UIColorPickerViewController
добавлен HDR-лайтбокс.UINavigationItem
позволяют задавать комплексные атрибуты титулов и подзаголовков, улучшена работа жестов для интерактивного закрытия экранов и размещения поисковых панелей.UIScrollEdgeEffect
позволяет контролировать эффекты на краях скроллов, а появилось также взаимодействие UIScrollEdgeElementContainerInteraction
для кастомных элементов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Getting access to the user’s calendar
🗓 Для работы с календарем и напоминаниями пользователей используется фреймворк
🔴 Перед доступом к календарю необходимо получить разрешение от пользователя, используя ключи конфиденциальности в настройках проекта:
🖥 Для запроса доступа к событиям и напоминаниям используются методы
⚠️ Текущий статус авторизации можно проверить с помощью метода
➡️ Рекомендуется создать отдельный класс, например
EventKitt
, который предоставляет все необходимые инструменты для создания и получения событий.Privacy - Calendars Full Access Usage Description
и Privacy - Reminders Full Access Usage Description
.requestFullAccessToEvents
и requestFullAccessToReminders
, а также requestWriteOnlyAccessToEvents
для приложений, которые не требуют чтения календаря.authorizationStatus(for:)
, который возвращает значения EKAuthorizationStatus
, такие как fullAccess
, writeOnly
, denied
, notDetermined
и restricted
.CalendarPermissionsViewModel
, для управления статусом доступа к календарю и напоминаниям, а также для обработки запросов на доступ.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Inspect & optimize Image Decoding timing in iOS
⌛ Декодирование изображений в iOS происходит в основном потоке во время фазы коммита
⚙️ Используйте методы UIKit, такие как
➡️ Старайтесь использовать
⚠️ Использование API
Core Animation
, что может вызывать зависания приложения при работе с большими изображениями.prepareForDisplay
и prepareThumbnail
, для предварительной обработки изображений в фоновом режиме, чтобы избежать задержек в основном потоке.ImageIO
для создания уменьшенных изображений перед дальнейшей обработкой и избегайте копирования изображений между основной и графической памятью для повышения производительности.UIImageReader
в iOS 17 может привести к утечкам памяти, которые были исправлены в iOS 18.Getting HDR UIImage in iOS 17 and display it in a UIImageView will result in major memory leak internally. Apple have fixed this issue on iOS 18
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
High Level Anatomy of a Camera Capturing Session
❓ Камера или микрофон служат источником для захвата видео, фото или аудио, включая заднюю и фронтальную камеры.
ℹ️ Выход может быть в виде фото или видео, которые сохраняются на диске или обрабатываются для распознавания лиц и применения фильтров.
➡️
❓ Метод
➡️
AVCaptureSession
является центральным контроллером, который управляет входами, выходами и предварительными слоями для захвата медиа.capturePhoto
асинхронный, что означает, что захват фото занимает время из-за фокусировки и экспозиции.AVCapturePhoto
- это необработанный вывод, PHAsset
- ссылка на изображение в библиотеке, CGImage
- это битовая карта, а Image
в SwiftUI
- визуальное представление.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Certificate Pinning on iOS in Practice
Статья про то, что такое
⚠️ Основная цель реализации
🖥 Certificate pining включает в себя проверку цепочки сертификатов, состоящей из корневого, промежуточного и конечного сертификатов, с акцентом на конечный сертификат для обеспечения безопасности соединения.
ℹ️ Можно пиннить как весь сертификат, так и его отпечаток или открытый ключ, что дает гибкость в управлении сертификатами, особенно при их обновлении.
❗️ Обновление сертификатов может быть неудобным, так как требует обновления приложения. Рекомендуется использовать пиннинг открытого ключа или удаленные обновления сертификатов через такие решения, как
⚙️ Для реализации
Статья про то, что такое
certificate pining
и как его настроить.certificate pining
— защита от атак типа человек посередине
, которые могут позволить злоумышленникам перехватывать данные пользователей и тестировать уязвимости API.CloudKit
.certificate pining
в iOS необходимо использовать URLSessionDelegate
для обработки аутентификационных вызовов и проверки доверенных сертификатов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Swift Computed Property: Code Examples
Вдруг вы не знаете, что такое вычисляемое свойство - эта статья для вас🙂
ℹ️ Вычисляемое свойство в Swift предоставляет геттер и необязательный сеттер для косвенного доступа к другим свойствам и значениям, позволяя создавать новые значения на основе существующих.
❓
⚠️ Вычисляемые свойства выполняют свои операции каждый раз при доступе, что может привести к снижению производительности при тяжелых вычислениях. Рекомендуется использовать сохраненные значения, если вычисления статичны.
➡️
Такие свойства не принимают аргументы, поэтому для логики, требующей динамических входных параметров или тяжелых вычислений, лучше использовать методы для повышения читаемости и управления производительностью.
❓ Вычисляемые свойства могут иметь асинхронные геттеры, позволяя использовать
Вдруг вы не знаете, что такое вычисляемое свойство - эта статья для вас
Computed properties
могут использоваться для создания значений, таких как имя файла, основанное на других свойствах, или для управления доступом к внутренним объектам через публичные интерфейсы.Такие свойства не принимают аргументы, поэтому для логики, требующей динамических входных параметров или тяжелых вычислений, лучше использовать методы для повышения читаемости и управления производительностью.
await
для выполнения операций, таких как валидация данных перед возвратом значения.struct Content {
enum ContentError: Error {
case emptyFileExtension
}
let name: String
let fileExtension: String
/// A computed property to generate a filename.
/// Throws an error when the file extension is empty.
var filename: String {
get throws(ContentError) {
guard !fileExtension.isEmpty else {
throw .emptyFileExtension
}
return name + "." + fileExtension
}
}
}
/// We now need to use the `try` keyword when accessing:
print(try content.filename) // Prints: "swiftlee-banner.png"
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Overview on Accessibility Nutrition Labels for iOS development
ℹ️ На WWDC25 Apple представила метки доступности, которые отображаются в App Store и информируют пользователей о поддерживаемых функциях доступности приложений.
🖥 Разработчики могут заявить о поддержке таких функций, как
🔈
🔍 Поддержка
➡️ Поддержка достаточной контрастности помогает пользователям с низким зрением; разработчики могут использовать инструмент
➡️ Субтитры обеспечивают текстовую альтернативу для пользователей с нарушениями слуха, а аудиодескрипции предоставляют устное описание визуального контента для пользователей с нарушениями зрения.
VoiceOver, Voice Control, Dynamic Type, Dark Mode
, и других, чтобы улучшить доступность своих приложений.VoiceOver
- это экранный диктор, который помогает пользователям навигировать по приложению без визуального контакта, требуя от разработчиков ручной настройки для улучшения опыта.Dynamic Type
позволяет пользователям увеличивать размер текста на устройствах iOS, что делает текст более читаемым и удобным.Color Contrast Calculator в Xcode
для проверки соответствия.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2