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

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

По всем вопросам обращаться к @itereznikov
Download Telegram
Изучаем новые структуры данных для iOS разработчика

Статья про редко используемые структуры данных: Deque, Heap, OrderedSet и OrderedDictionary.

Deque предоставляет возможность работать с коллекцией элементов, к которой можно добавлять и удалять элементы как с начала, так и с конца, с амортизированной сложностью О(1).

Heap (куча) - частично-упорядоченное дерево с эффективными операциями вставки и удаления, обладающее сложностью операций вставки O(log n) и получения минимального/максимального элемента O(1).

OrderedSet и OrderedDictionary это коллекции, в которых поддерживается порядок элементов и обеспечивается уникальность ключей.
9🔥3🥰2🎉1
This media is not supported in your browser
VIEW IN TELEGRAM
Enhancing your app with fluid transitions

iOS 18 будет доступен плавный интерактивный зум-переход. Можно использовать как в SwiftUI, так и в UIKit.

Использовать очень просто: нужно проставить свойство preferredTransition на новом контроллере и передать замыкание, которое вернет вью, с которого мы зумим.


// Create a detail view controller for the selected item.
let detailViewController = MyDetailViewController(itemID: itemID)


// Set the preferred transition to zoom.
detailViewController.preferredTransition = .zoom { [self] _ in

// Return the thumbnail view for the selected item.
return thumbnail(for: itemID)
}


// Push the detail view controller onto the navigation stack.
navigationController?.pushViewController(detailViewController, animated: true)
👍8🔥4
How to solve problems with bitwise operators in Swift

Бит – это наименьшая часть информации, которая может быть 1 или 0. Swift предлагает операторы для манипуляции битами, такие как OR, AND, LEFT SHIFT и RIGHT SHIFT, которые могут быть использованы для решения задач с битовыми операциями.


0b00000011 | 0b00000101 // The bitwise OR operator produces 0b00000111
0b00000011 & 0b00000101 // The bitwise AND operator produces 0b00000001
0b00000010 << 1 // The bitwise LEFT SHIFT operator << produces 0b0000100
0b00000010 >> 1 // The bitwise RIGHT SHIFT operator >> produces 0b0000001


Однако, для решения задач, где нужны битовые сдвиги, можно воспользоваться уже готовым типом OptionSet.


struct WeekdayOptions: OptionSet {
let rawValue: Int

static let sun = WeekdayOptions(rawValue: 1 << 0)
static let sat = WeekdayOptions(rawValue: 1 << 1)
static let fri = WeekdayOptions(rawValue: 1 << 2)
static let thu = WeekdayOptions(rawValue: 1 << 3)
static let wed = WeekdayOptions(rawValue: 1 << 4)
static let tue = WeekdayOptions(rawValue: 1 << 5)
static let mon = WeekdayOptions(rawValue: 1 << 6)
}


P.S. Но я рекомендую много раз подумать, а точно ли вам нужны битовые маски, прежде чем их использовать
👍42
A Beginner’s Guide to Code Signing in iOS Development

Must read статья для понимания процесса подписи приложения и публикации.

Code signing – это сложный процесс, включающий создание запроса на сертификат, создание provisioning профиля и подписание кода приложения с использованием инструмента codesign в Xcode. Понимание основополагающих концепций криптографии с открытым ключом, хэш-функций и центров сертификации может помочь вам более эффективно управлять ими, особенно по мере роста вашего проекта.
🔥31
Интересный тред после WWDC

Автор задается вопросом, после просмотра сессии про управление памятью в Swift, есть ли гарантированный способ определения была ли выделена память на куче? Swift не предоставляет способа узнать, скрывает ли тип значения частные ссылочные типы, но можно использовать функцию _isPOD() в стандартной библиотеке для этой цели:


There's an _isPOD() (Warning: underscored API!) entry point in the stdlib for this purpose:
print(_isPOD(Int.self)) // true
print(_isPOD(Array<Int>.self)) // false


В треде люди делятся другими интересными способами как это определить
🔥5
Async await in Swift: The Full Toolkit

Крутая статья от ребят из Emerge Tools про инструменты Swift Concurrency. Подробно и понятно описаны основные возможности и есть примеры использования таких штук:
async / await и async let
Task и Task group
Actors и MainActor
Sendable
Continuations
AsyncSequence
AsyncStream
Async Algorithms

Статья обязательна к прочтению, особенно если только начинаете использовать Swift Concurrency.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Скрытая (на виду) сила KeyPath'ов

KeyPath'ы в Swift - это параметризованные типами объекты, позволяющие читать и записывать переменные типа Value в значения типа Root. Они представлены в виде классов и образуют иерархию типов, включая AnyKeyPath, PartialKeyPath, KeyPath, WritableKeyPath и ReferenceWritableKeyPath.

KeyPath'ы могут быть конвертированы в функции, объединяться, предоставлять доступ по индексу и использоваться в качестве токенов. Они также поддерживают Type Inference и атрибут @dynamicMemberLookup.

В самой статье автор рассматривает так же примеры использования KeyPath для создания удобных API.
🔥3
MIT Professor on Data Abstraction & Object-Oriented Programming

Супер классное видео с автором одного из принципов SOLID. В видео затрагивается немного истории, разбирают технические детали самого принципа и отвечают на разные вопросы.

Советуем смотреть всем, оно небольшое.
❤‍🔥3
Non-Sendable types are cool too you know

Sendable - это "маркерный протокол", обозначающий, что тип может свободно передаваться между изолированными доменами. Non-Sendable типы не могут быть переданы между изолированными доменами и остаются в том домене, в котором были созданы.

Non-Sendable типы могут быть полезны для моделирования изменяемого состояния, совместимого с произвольно изолированными клиентами, и могут иметь полезные асинхронные методы. Иными словами, такие типы можно использовать особо не задумываясь о потокобезопасноти.

Использование параметра isolation(any) в сочетании с новыми функциями Swift 6 позволяет non-Sendable типам участвовать в конкурентности, обеспечивая безопасность и гибкость.
🔥2
iOS App Launch Optimization: How Cityflo Achieved 2.22x Faster Load Times

Запуск приложения кажется незаметным, пока не становится долгим. И чем больше логики тем сложнее это оптимизировать.

В статье автор поделился опытом ускорения запуска приложения с рассмотрением всех моментов, на которые они сделали упор после анализа времени запуска: оптимизацию библиотек, ленивая инициализация, рефакторинг AppDelegate, удаление избыточной логики и оптимизация последовательности вызовов API.
👍32
Streamlining NotificationCenter Usage in Swift

Автор описывает интересный подход использования NotificationCenter у себя в проекте: создание протокола с расширением, содержащим некоторые реализации функций. Это позволяет поддерживать чистоту в коде, а также дает возможность проводить тестирование такой функциональности.
❤‍🔥2
Как вернуть контроль над состоянием данных с RemoteResult

Автор предлагает расширить Result, чтобы сделать его более удобным и преварить его в:


enum RemoteResult<Success, Failure: Error> {
case idle
case loading
case success(Success)
case failure(Failure)
}


Это позволит лучше управлять состоянием данных и реагирововать на состояние загрузки и «простоя». RemoteResult может быть адаптирован для использования в архитектурах программирования, таких как The Composable Architecture, путем внесения простых изменений для совместимости с логикой сравнения состояний.
3👍1😁1
Recursive enums in Swift

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

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


enum FileSystemItem {
case file(name: String)
case folder(name: String, items: [FileSystemItem])
indirect case alias(name: String, to: FileSystemItem)
}
👍5
Subtitle Shenanigans in SwiftUI’s Menu

Компонент Menu из SwiftUI – невероятно сложный API с точки зрения сложности поддерживаемых им взаимодействий. В статье рассматриваются неочевидные способы его настройки и обсуждаются распространенные проблемы, с которыми сталкиваются разработчики при использовании HStack и VStack и предлагаются практические решения для их преодоления.

Статья еще интересна с точки зрения того, как можно разбирать документированные API и находить в них несоответствия, а также искать способы решения.
👍3
viewIsAppearing

Некоторые могли пропустить, но на WWDC 2023 было представлено важное дополнение про жизненный цикл контроллера.

Этот метод вызывается после вызова viewWillAppear и перед вызовом viewWillLayoutSubviews. Отлично подходит для fine-tune'а динамического интерфейса или самой презентации контроллера.
❤‍🔥9
Typed throws in Swift

В Swift 6.0 изменили привычный подход работы с выбрасываемыми ошибками: в прошлых версиях нельзя было указать конкретный тип. Теперь компилятор будет понимать какую именно ошибку мы будем выбрасывать.


enum FooError: Error {
case tooBig
case tooSmall
}

func foo() throws(FooError) -> Int {
let value = Int.random(in: 1...100)

guard value < 60 else {
throw FooError.tooBig
}

guard value > 20 else {
throw FooError.tooSmall
}

return value
}



В месте использования нам теперь не нужно лишнее приведение типов.


func boo() {
do {
let value = try foo()
print(value)
} catch {
switch error {
case .tooBig:
print("Too big...")
case .tooSmall: print("Too small...")
}
}
}
27
Performance Testing для iOS

Для тестирования производительности iOS приложений существуют различные способы, включая использование Xcode Organizer, MetricKit и TestFlight для анализа показателей запуска, отзывчивости интерфейса, потребления памяти и других аспектов.

В статье разобраны различные способы сбора метрик, в том числе использование блока measure для измерения производительности кода, создание signpost'ов, а также запись данных и последующий анализ результатов для определения трендов.
72
Upload iOS App to TestFlight with GitHub Actions and Fastlane Match

Если вы проводите деплой приложения руками и вас это достало, то это статья для вас. Автор рассказывает, как провести настройку деплоя используя fastlane, связке с GitHub Secrets для хранения ключей и GitHub actions для построения полноценного workflow.

Неплохая статья для понимания того, как работает Continuous Deployment.
3🔥2
Marking Swift Properties Available by iOS Version

В текущих версиях Swift мы можем пометить структуры, классы и расширения доступными для определенных версий ОС.


@available(iOS 18.0, *)
struct GetQuoteControlWidget: ControlWidget {
// code
}


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


private var _customTool: NSObject? = nil
@available(iOS 18.0, *)
private var customToolWrapper: PKToolPickerCustomItem {
if _customTool == nil {
let tool = PKToolPickerCustomItem(configuration: .init(identifier: someID, name: someName))
_customTool = tool
}
return _customTool as! PKToolPickerCustomItem
}
7
SWIFT BUILD TIMES AND MODULE VERIFICATION

После расширения кодовой базы и рефакторинга, автор разбил приложение на множество модулей и стал замечать просадки в сборке проекта. После исследования он обнаружил, что флаг ENABLE_MODULE_VERIFIER был установлен в YES. Сам флаг отвечает за верификацию модулей на этапе сборки. Автор выключил этот флаг для дебаг сборок и уменьшил время с 3,5 минут до 52 секунд.
Но стоит понимать, что этот флаг не панацея и он лишь экономит время сборки, пропуская один из этапов и перед отправкой релизной сборки его все же стоит включить обратно.
5