Flutter expense_pro loyihasining SwiftUI versiyasi. Clean Architecture + MVVM + Combine.
- Xcode 15+
- iOS 16+
- CocoaPods
- xcodegen:
brew install xcodegen
# 1. Xcode loyihasini generatsiya qilish
xcodegen generate
# 2. Pod'larni o'rnatish
pod install
# 3. Workspace'ni ochish
open ExpenseProiOS.xcworkspaceExpenseProiOS/
├── App/ # Entry point, AppDelegate
├── Core/ # DI, Theme, Network, Errors, Services
├── Router/ # NavigationStack + TabView shell
├── Features/ # Clean Architecture (har bir feature)
│ ├── Auth/
│ │ ├── Data/ (DataSource, Repository impl, Models)
│ │ ├── Domain/ (Entity, Repository protocol, UseCase)
│ │ └── Presentation/ (ViewModel, View)
│ ├── Main/
│ ├── Home/
│ ├── Finance/
│ ├── Goals/
│ ├── AddExpense/
│ └── Profile/
└── Resources/ # Localizable.xcstrings, Assets, Info.plist
- UI: SwiftUI + Combine
- Backend: Supabase (supabase-swift)
- DI: Swinject
- Local storage: KeychainAccess (token) + UserDefaults/FileManager (preferences)
- Image: Kingfisher
- Lokalizatsiya: String Catalog (
.xcstrings) — en, ru, uz, fr
- Har bir feature uchun
Dataqatlamini Supabase'ga ulash - BLoC →
@ObservableViewModel migratsiyasi -
flutter_genassetlari →Assets.xcassets -
make genekvivalenti kerak emas (Swift'da build-time codegen yo'q)
Flutter/Dart dan kelgan dasturchi uchun iOS (Swift + SwiftUI) ni 0 dan professional darajagacha o'rganish yo'li. Har bir bosqich oldingisining ustiga quriladi.
- Xcode o'rnatish (App Store)
- Command Line Tools:
xcode-select --install - Homebrew +
brew install xcodegen cocoapods swiftlint swiftformat - Apple Developer akkaunt (bepul — simulyator uchun yetadi)
- Xcode interfeysini o'rganish: Navigator, Inspector, Console, Simulator
Natija: Simulyator'da "Hello World" app ishga tushadi.
-
var/let, type inference - Optional (
?,!,if let,guard let,??) -
structvsclass(value vs reference semantics) -
enum— associated values, raw values - Funksiyalar, closures, trailing closure sintaksisi
- Protocol va protocol-oriented programming (POP)
- Generics (
<T>,whereclause) - Extensions
- Error handling:
throws,try,do-catch,Result<Success, Failure> - Property wrappers (
@State,@Published)
-
async/await,Task,actor,@MainActor - Access control:
private,fileprivate,internal,public,open - ARC,
weak,unowned, retain cycles - Key paths (
\.property)
Manba: Swift.org Tour, Hacking with Swift — 100 Days of Swift.
-
Viewprotocol,some View,@ViewBuilder -
VStack,HStack,ZStack,Spacer,Group - Modifier'lar zanjiri — tartib muhim
-
Text,Image,Button,TextField,Toggle,Picker -
List,ForEach,ScrollView,LazyVStack,LazyHGrid
-
@State— lokal o'zgaruvchan holat -
@Binding— parent ↔ child bog'lanish -
@StateObjectvs@ObservedObject -
@EnvironmentObject— DI orqali uzatish -
@Environment(dismiss, colorScheme, locale) - Yangi
@Observablemakrosi (iOS 17+)
-
NavigationStack+navigationDestination(for:) -
NavigationPath— type-erased stack -
TabView+.tag() -
.sheet,.fullScreenCover,.alert,.confirmationDialog - Deep linking —
onOpenURL
Amaliyot: Ushbu ExpenseProiOS loyihasidagi Router/ papkasini tahlil qiling.
- MVVM + SwiftUI
- Clean Architecture: Data / Domain / Presentation qatlamlari
- Dependency Injection — Swinject yoki qo'lda
- Coordinator / Router pattern
- Repository + UseCase patternlari
Amaliyot: Ushbu loyihada Features/Auth/ qatlamini o'rganing.
- Combine:
Publisher,Subscriber,@Published,sink,assign - Operatorlar:
map,filter,flatMap,debounce,combineLatest -
AnyCancellableva xotira boshqaruvi - Swift Concurrency:
async let,TaskGroup,AsyncSequence -
URLSessionasync API - Flutter solishtiruvi: Stream/Future → AsyncSequence/Task
-
URLSession— GET, POST, JSON -
Codable,JSONEncoder,JSONDecoder,CodingKeys - Alamofire (ixtiyoriy, loyihada bor)
- Supabase Swift SDK (loyihada ishlatiladi)
- Auth token refresh, interceptor pattern
-
UserDefaults— oddiy sozlamalar - Keychain — maxfiy ma'lumotlar (KeychainAccess)
- FileManager — fayllar
- Core Data yoki SwiftData (iOS 17+) — kattaroq bazalar
- SQLite / GRDB — SQL kerak bo'lsa
- Animatsiyalar:
.animation,withAnimation,matchedGeometryEffect - Gestures:
TapGesture,DragGesture,LongPressGesture - Custom Shapes, Paths, Canvas
- GeometryReader va responsive layout
- Accessibility — VoiceOver, Dynamic Type
- Lokalizatsiya — String Catalog (
.xcstrings) - Dark Mode,
@Environment(\.colorScheme) - SF Symbols — tizim ikonlari
- Camera / PhotoPicker —
PhotosUI - Location —
CoreLocation - Notifications — local va push (APNs, FCM)
- Biometrics —
LocalAuthentication(FaceID/TouchID) - Haptics —
UIFeedbackGenerator - Background tasks
- App Intents / Shortcuts (iOS 16+)
- Widgets (WidgetKit)
- XCTest — unit test
- Swift Testing (yangi framework, iOS 17+)
- XCUITest — UI test
- Snapshot testing — pointfreeco/swift-snapshot-testing
- Mock'lar — protocol orqali
- Instruments — profiling, memory leak, Time Profiler
- SwiftLint / SwiftFormat — kod sifati
- Code signing, Provisioning Profiles
- App Store Connect — build yuklash
- TestFlight — beta test
- Fastlane — avtomatlashtirish
- GitHub Actions / Xcode Cloud — CI/CD
- App Store Review Guidelines
- Swift Package Manager (SPM) — modulyar arxitektura
- UIKit interop —
UIViewRepresentable,UIViewControllerRepresentable - Metal / SceneKit / RealityKit (agar kerak bo'lsa)
- WatchOS, iPadOS, macOS (Catalyst)
- Performance — RunLoop, render hook, Instruments
- Xavfsizlik — ATS, certificate pinning, jailbreak detection
- Open Source — GitHub'da hissa qo'shing
| Flutter | iOS (SwiftUI) |
|---|---|
Widget |
View |
StatelessWidget |
struct View |
StatefulWidget + setState |
@State |
Provider / Riverpod |
@StateObject + @EnvironmentObject |
BLoC |
ObservableObject + Combine |
GoRouter |
NavigationStack + AppRouter |
Future<T> |
async throws -> T |
Stream<T> |
AsyncSequence / Publisher |
Dio / http |
URLSession / Alamofire |
shared_preferences |
UserDefaults |
flutter_secure_storage |
Keychain |
get_it / injectable |
Swinject |
freezed / json_serializable |
Codable (til darajasida) |
intl / .arb |
String Catalog (.xcstrings) |
pubspec.yaml |
Podfile + Package.swift |
- Rasmiy: developer.apple.com, Swift Book
- Videolar: WWDC sessiyalari (developer.apple.com/videos)
- Kurslar: Stanford CS193p (YouTube, bepul), Paul Hudson — "Hacking with Swift"
- Kitoblar: SwiftUI by Tutorials (Kodeco), Advanced Swift (objc.io)
- Hamjamiyat: Swift Forums, r/swift, iOS Dev Weekly (newsletter)
- Amaliyot: LeetCode (Swift), ushbu ExpenseProiOS loyihasi
| Bosqich | Vaqt | Natija |
|---|---|---|
| 0–1 | 3–4 hafta | Swift tilini bilaman |
| 2–3 | 5–6 hafta | SwiftUI'da app yoza olaman |
| 4–5 | 4 hafta | Real backend bilan ishlay olaman |
| 6–7 | 3–4 hafta | Sifatli UI + qurilma funksiyalari |
| 8–9 | 3 hafta | Test yozaman, App Store'ga chiqaraman |
| 10 | Doimiy | Professional, komandada ishlay olaman |
Jami: ~5–6 oy intensiv mashq (kuniga 2–3 soat).