Testing Private Members in Swift with @_private(sourceFile:)
👀 Атрибут
❓ Ранее разработчики могли либо делать приватные члены внутренними, что нарушает инкапсуляцию, либо тестировать только через публичные API, что усложняет отладку.
⚙️ Для использования
⚠️ Рекомендуется использовать
@_private(sourceFile:) в Swift позволяет тестировать приватные члены классов, обходя контроль доступа, что полезно для написания более точных юнит-тестов.@_private необходимо включить приватные импорты в модуле с помощью флага -enable-private-imports и использовать условную компиляцию в тестах.@_private только в тестах, оборачивая его в условные флаги компиляции для обеспечения гибкости и возможности отключения при изменениях в Swift.Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥1❤1🔥1
На днях команда Swift выпустила…
Странный шаг, честно говоря.
KMP вроде бы не стал панацей, с чего вдруг это сработает в обратную сторону… Swift SDK для Android доступен для загрузки с установщика Windows или отдельно для Linux и macOS.Swift для Android.Swift Package Index уже совместимы с Android, что упрощает портирование существующих пакетов.Android разрабатывает документ видения, который определит приоритетные направления для будущей работы с Swift на Android.Please open Telegram to view this post
VIEW IN TELEGRAM
🤯7👍5❤🔥2
Thread-Safe Classes: GCD vs Actors
⚙️ Многопоточность и гонки данных являются распространенными проблемами в программировании, особенно при работе с общими ресурсами, такими как словари.
➡️ Использование конкурентной очереди и синхронных/асинхронных вызовов позволяет создать потокобезопасный кэш, предотвращая гонки данных и обеспечивая целостность состояния.
➡️ Лучшей практикой является использование барьеров для обеспечения эксклюзивного доступа к ресурсам при записи, что позволяет одновременно выполнять чтение.
➡️ Акторы обеспечивают безопасность параллелизма, позволяя только одной задаче одновременно получать доступ к изолированному состоянию, что упрощает синхронизацию.
✔️ Сравнение различных подходов к потокобезопасности показывает, что использование акторов является наиболее современным и безопасным методом для работы с многопоточностью в Swift.
Хорошая статья с кучей примеров, рекомендую к прочтению.👍
Хорошая статья с кучей примеров, рекомендую к прочтению.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤🔥2
Singletons with Swift Concurrency
🖥 Синглтоны представляют собой глобальное состояние, что делает их источником проблем в многопоточном окружении, так как они не являются потокобезопасными.
⚠️ Рекомендуется избегать использование синглтонов и вместо этого использовать паттерн корня компоновки или передавать аргументы в функции.
🔍 Аннотация
➡️ Среди альтернатив синглтонам рассматриваются кастомные актеры, использование блокировок и аннотация
😲 А вы знали, что у Apple есть тоже документация по синглтонам?
@MainActor позволяет гарантировать потокобезопасный доступ к синглтону, что упрощает аудит и выявление проблем в коде.@unchecked Sendable, но каждая из этих опций имеет свои недостатки.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Understanding task cancellation and lifetimes in Swift concurrency
ℹ️ В Swift
➡️ Несструктурированные задачи, созданные с помощью
➡️ При работе с долгоживущими задачами, такими как
⚠️ Отмена задач в Swift не останавливает их немедленно, а устанавливает флаг отмены, который асинхронные операции могут проверять для корректного завершения.
structured concurrency связывает время жизни асинхронной работы с областью, в которой она была создана, автоматически отменяя задачи при завершении этой области.Task { ... }, работают независимо и требуют ручной отмены, в то время как Task.detached выполняется полностью независимо от контекста вызова.AsyncStream, важно управлять временем жизни задачи, чтобы избежать бесконечного выполнения.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Combine – швейцарский нож iOS-разработчика. Или нет?
ℹ️
⚙️ Основные компоненты Combine включают
➡️
⚠️ Важно помнить о сохранении подписок, так как их отсутствие может привести к потере данных, а также учитывать, что
❓ А вы пользуетесь
Combine — это фреймворк для работы с асинхронными событиями в декларативном стиле, который упрощает управление потоками данных и избавляет от сложностей, связанных с колбэками.Publisher, Subscriber и Subscription, которые взаимодействуют для передачи и обработки данных.Combine активно используется в SwiftUI через аннотации @Published и @ObservedObject, что позволяет автоматически обновлять интерфейс при изменении данных.@Published не сравнивает значения, что может вызвать лишние обновления.Combine?Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👎2
A deep dive into Collections, Sequences, and Iterators in Swift
⚙️
🔼
ℹ️ Цикл
💡
❗️ Создание собственных коллекций требует внимательности к индексам и производительности, чтобы гарантировать, что они соответствуют ожиданиям стандартной библиотеки.
Sequence в Swift — это базовая единица итерации, которая требует от типа, чтобы он предоставлял новый итератор каждый раз при вызове makeIterator().Collection расширяет Sequence, обеспечивая многократную итерацию, стабильный порядок и доступ к индексам, что позволяет оптимизировать производительность.for … in фактически преобразуется в вызов makeIterator() и последующий вызов next() для получения элементов, что позволяет избежать ошибок при изменении коллекции во время итерации.Swift Concurrency вводит AsyncSequence и AsyncIteratorProtocol, позволяя использовать асинхронные итераторы с поддержкой приостановки и обработки ошибок.struct Countdown: Sequence {
let start: Int
func makeIterator() -> Iterator {
Iterator(current: start)
}
struct Iterator: IteratorProtocol {
var current: Int
mutating func next() -> Int? {
guard current >= 0 else { return nil }
defer { current -= 1 }
return current
}
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍4