Нативная разработка iOS-приложения на Swift
Swift — не просто замена Objective-C. Это другой способ думать об архитектуре: строгая типизация, value semantics, async/await вместо callback hell, SwiftUI-декларативность вместо императивного UIKit. Приложение, написанное с учётом этих принципов, проще поддерживать и масштабировать.
Архитектура: что выбираем и почему
Для большинства продуктовых приложений мы используем Clean Architecture с MVVM на уровне представления. Разделение на слои — Domain, Data, Presentation — позволяет тестировать бизнес-логику без UI и без зависимости от конкретного фреймворка данных.
ViewModel на Swift Concurrency: @MainActor для публикации состояния в UI-поток, Task для фоновой работы. Никакого DispatchQueue.main.async вручную — компилятор проверяет потокобезопасность через Sendable и actor isolation.
Навигация. UIKit: Coordinator Pattern — AppCoordinator управляет UINavigationController, дочерние координаторы отвечают за флоу (AuthFlow, MainFlow, OnboardingFlow). Это изолирует навигационную логику от ViewController'ов. SwiftUI: NavigationStack с NavigationPath для программной навигации, Router-объект как EnvironmentObject.
Зависимости. Swift Package Manager вместо CocoaPods там, где это возможно. SPM — нативный инструмент, не требует pod install и не ломает workspace. Для пакетов, ещё не мигрировавших в SPM (редкость в 2024), используем CocoaPods точечно.
Типичный стек: Alamofire или нативный URLSession для сети, Combine или async/await для реактивности, Kingfisher для кэширования изображений, swift-composable-architecture (TCA) для особо сложных стейт-машин.
Где теряется время на старте
Cold start. Приложение запускается медленно, если в application(_:didFinishLaunchingWithOptions:) происходит слишком много синхронной инициализации: SDK аналитики, Core Data stack, конфигурация Firebase. Решение: ленивая инициализация некритичных сервисов, тяжёлые операции на background queue, MetricKit для мониторинга времени запуска в продакшене.
Memory leaks в замыканиях. Классика: [weak self] забыли в closure, переданном в NotificationCenter или Timer. Instruments → Leaks + Memory Graph Debugger — обязательная часть процесса до релиза. Xcode 15 добавил предупреждения в компилятор для части таких случаев, но не для всех.
UITableView и UICollectionView с тяжёлыми ячейками. Декодирование JPEG на main thread при cellForRowAt — FPS падает при быстром скролле. Переносим декодирование на background через ImageIO с явным kCGImageSourceShouldCacheImmediately: true, а ячейку заполняем уже готовым CGImage. На iPhone SE 2nd gen разница между правильным и неправильным подходом — 8 FPS vs 60 FPS при скролле ленты.
SwiftUI vs UIKit: как принимаем решение
| Критерий | UIKit | SwiftUI |
|---|---|---|
| iOS минимум | iOS 13+ нормально, iOS 12- | iOS 14+ для стабильной работы |
| Кастомные анимации | Полный контроль через Core Animation | Ограничен, но расширяется с каждой версией |
| Производительность списков | UICollectionView Compositional Layout — лучший в классе | List достаточен для большинства; LazyVStack для кастома |
| Команда | UIKit знают все iOS-разработчики | SwiftUI требует переосмысления паттернов |
| Сложные жесты | UIGestureRecognizer — максимальный контроль |
gesture modifier + GestureState — достаточно в большинстве случаев |
Для новых проектов с iOS 16+ минимумом — SwiftUI как основа, UIKit для компонентов, где SwiftUI ещё не дотягивает (кастомные клавиатурные аксессуары, некоторые жестовые взаимодействия). Для поддержки iOS 14 — гибрид, где UIKit backbone и SwiftUI-экраны через UIHostingController.
Процесс разработки
Старт проекта: анализ требований → техническое проектирование архитектуры → согласование → разработка по спринтам. Каждый модуль сопровождается unit-тестами на бизнес-логику (XCTest), критичные UI-флоу — UI-тестами (XCUITest).
CI/CD через Fastlane: fastlane test на каждый PR, fastlane beta для TestFlight, fastlane release для App Store. Сборки для тестировщиков — автоматически при мерже в develop.
Firebase Crashlytics — подключается в начале проекта, не перед релизом. Краши в TestFlight ловим заранее.
Что влияет на сроки
- Количество экранов и сложность навигационного флоу
- Интеграции: платежи (StoreKit 2), авторизация (Sign in with Apple, OAuth), карты (MapKit), камера/фото (AVFoundation, PhotosUI)
- Необходимость поддержки iPad / Mac Catalyst
- Наличие готового дизайна и API
Прямолинейное приложение (авторизация, лента, профиль, детали): 3–4 недели. Продукт со сложной бизнес-логикой, кастомными компонентами и интеграциями: 2–3 месяца. Стоимость рассчитывается индивидуально после оценки ТЗ.







