Financify — это iOS-приложение для управления личными финансами, разработанное с применением современного стека технологий. Проект демонстрирует реализацию сложных технических решений, таких как Offline-First архитектура, гибридный UI на SwiftUI и UIKit, а также продвинутую работу с графикой и анимацией.
Приложение спроектировано для обеспечения полной функциональности в условиях нестабильного или отсутствующего интернет-соединения.
- Локальное хранилище на SwiftData: Все данные (счета, транзакции, категории) сохраняются в локальной базе данных
SwiftData, что обеспечивает мгновенный доступ и возможность работы в оффлайн-режиме. - Очередь отложенных операций: Любые изменения, сделанные в оффлайн-режиме, не теряются, а добавляются в очередь
PendingOperation. Каждая операция содержитHTTP-метод,endpointиpayloadзапроса. - Умная синхронизация:
SynchronizationServiceавтоматически обрабатывает очередь при восстановлении соединения. Сервис анализирует ответы сервера:- Клиентские ошибки (4xx): Считаются неисправимыми (например, невалидные данные) и удаляются из очереди.
- Серверные ошибки (5xx) или сбои сети: Операция остается в очереди для повторной попытки.
- Вычисляемый баланс в оффлайн-режиме:
BankAccountServiceобеспечивает актуальность данных даже без сети. При запросе баланса он берет последнее синхронизированное состояние счета и последовательно применяет к нему все операции из очереди, динамически вычисляя текущий баланс.
Проект использует преимущества обоих фреймворков для создания UI.
- Основной UI на SwiftUI: Большинство экранов реализовано на
SwiftUIс использованием архитектуры MVVM для четкого разделения логики и представления. - VIP-модуль на UIKit: Экран "Анализа" (
AnalysisViewController) построен наUIKitс использованием архитектуры VIP (Clean Swift). Это демонстрирует способность интегрировать модули с разной архитектурой в единое приложение. - Бесшовная интеграция: Переход между фреймворками реализован с помощью
UIViewControllerRepresentable(AnalysisViewControllerWrapper), что обеспечивает нативную навигацию и гладкий пользовательский опыт.
Графики в приложении являются не статичными изображениями, а интерактивными инструментами анализа.
- График баланса (Swift Charts): На экране "Счёт" (
BalanceView) реализован кастомный график на базеSwift Charts.- Интерактивность: Поддерживается скраббинг (
DragGesture) с отображением деталей во всплывающем окне и детальная информация по долгому нажатию (LongPressGesture), реализованная вChartInteractionOverlay.swift.
- Интерактивность: Поддерживается скраббинг (
- Анимированная круговая диаграмма (Custom UIView): Для экрана "Анализ" была создана собственная
PieChartView, вынесенная в локальный Swift-пакетUtilities. Она поддерживает плавные анимированные переходы между различными состояниями данных при фильтрации.
Поиск по категориям (CategoriesView) устойчив к опечаткам и ошибкам ввода.
- Алгоритм Дамерау-Левенштейна: В
CategoriesViewModel.swiftреализован алгоритм нечеткого поиска, который находит релевантные категории, даже если поисковый запрос содержит ошибки. Это значительно улучшает пользовательский опыт.
- Анимация запуска (Lottie): Вместо стандартного
LaunchScreenиспользуется красивая и плавная анимация, реализованная с помощьюLottieи вынесенная в отдельный локальный пакетLaunchAnimation. - Кастомные UI-модификаторы:
SpoilerView: Скрывает баланс с эффектом распадающихся частиц на основеCAEmitterLayer(как спойлер в Telegram).ShakeGestureModifier: Позволяет скрывать/показывать баланс по встряхиванию устройства.
- Сетевой слой (Alamofire): Вся работа с сетью инкапсулирована в
NetworkClient, который используетAlamofireдля выполнения запросов. Эндпоинты типизированы черезenum APIEndpoint. - Безопасное хранение ключей: Секретный
API_KEYвынесен в файл.xcconfig, который исключен из системы контроля версий (.gitignore).
- Alamofire: Работа с сетью в Swift.
- Lottie for iOS: Рендеринг After Effects анимаций.
Сделано с ❤️ и Swift
