SwiftUI RoadMap 2025
Muhriddinbek SamidovTajribali iOS Dasturchilari uchun SwiftUI Yo‘riqnomasi
Birinchi Bosqich: Kirish va Asosiy Konseptlar
📌 Maqsad: SwiftUI ning deklarativ sintaksisi va asosiy tushunchalarini tushunish.
🔹 O‘rganiladigan Mavzular:
- SwiftUI vs UIKit: Asosiy farqlar
- SwiftUI arxitekturasi va deklarativ UI
- View va Modifikatorlarni tushunish
- State Management: @State, @Binding, @ObservedObject, @EnvironmentObject
- Staklar (HStack, VStack, ZStack) va Layout tizimi
- SwiftUI da View Lifecycle
🛠 Amaliyot:
- VStack, HStack, va Image yordamida oddiy profil ekranini qurish
- @State va @Binding yordamida UI elementlarini o‘zgartirish
Ikkinchi Bosqich: Murakkab UI Komponentlari va Navigatsiya
📌 Maqsad: Navigatsiya va qayta ishlatiladigan UI komponentlarini mukammal o‘rganish.
🔹 O‘rganiladigan Mavzular:
- Lists, ScrollViews, Grids va Lazy Stacks
- Navigatsiya: NavigationStack va NavigationDestination
- @ViewBuilder yordamida maxsus qayta ishlatiladigan komponentlar
- ForEach va dinamik ro‘yxatlar bilan ishlash
- Dark Mode va Moslashuvchan UI
- Animatsiyalar va Transitions
🛠 Amaliyot:
- NavigationStack yordamida ko‘p sahifali ilova yaratish
- Yuklanish holatiga ega bo‘lgan maxsus Button yaratish
- UI elementini withAnimation yordamida animatsiya qilish
Uchinchi Bosqich: State Management va Ma'lumotlar Oqimi
📌 Maqsad: SwiftUI ilovalarida ma'lumotlar oqimini tushunish.
🔹 O‘rganiladigan Mavzular:
- @State, @Binding, @ObservedObject, @EnvironmentObject tushunchalari
- MVVM arxitekturasi SwiftUI da
- SwiftUI bilan Combine ishlatish
- CoreData va SwiftData integratsiyasi
- SwiftUI da Dependency Injection
🛠 Amaliyot:
- MVVM yordamida mavjud ilovani qayta tashkil qilish
- CoreData va SwiftUI yordamida Todo ilovasini yaratish
- SwiftUI da Combine asosida API chaqiruvini amalga oshirish
To‘rtinchi Bosqich: Tarmoq va API Integratsiyasi
📌 Maqsad: SwiftUI da haqiqiy ma'lumotlar bilan ishlash.
🔹 O‘rganiladigan Mavzular:
- REST API-lardan ma'lumot olish: URLSession va Async/Await
- JSON dekodlash va xatolarni boshqarish
- Offline saqlash uchun SwiftData yoki CoreData ishlatish
- WebSockets bilan ishlash
🛠 Amaliyot:
- Haqiqiy vaqt ma'lumotlarini olish uchun Weather App yaratish
- WebSockets yordamida jonli yangilanishlarni olish
Beshinchi Bosqich: Murakkab Animatsiyalar va UI Moslashtirish
📌 Maqsad: Interaktiv va silliq UI tajribalarini yaratish.
🔹 O‘rganiladigan Mavzular:
- Matched Geometry Effects
- TimelineView yordamida maxsus animatsiyalar
- @Namespace yordamida murakkab tranzitsiyalar
- Drag & Drop interaktsiyalari
🛠 Amaliyot:
- Drag-and-drop Kanban taxtasini yaratish
- Parallax scroll effektini yaratish
Oltiinchi Bosqich: SwiftUI Multi-Platform Ilovalar uchun
📌 Maqsad: SwiftUI ni macOS, watchOS va iPadOS ilovalari uchun ishlatish.
🔹 O‘rganiladigan Mavzular:
- iPadOS uchun moslashuvchan UI
- macOS uchun maxsus SwiftUI xususiyatlari
- watchOS UI elementlari
- Widgets va App Clips
🛠 Amaliyot:
- Mavjud iPhone ilovasini macOS ilovasiga aylantirish
- iOS uchun SwiftUI widgetini yaratish
Yettinchi Bosqich: Testlash va Ishlashni Optimallashtirish
📌 Maqsad: Kod sifatini va ilova ish faoliyatini yaxshilash.
🔹 O‘rganiladigan Mavzular:
- XCTest yordamida UI testlarini yozish
- Instruments yordamida SwiftUI views ni debugging qilish
- SwiftUI ishlashini optimallashtirish
🛠 Amaliyot:
- Namuna ilovada ishlashni sekinlashtiradigan joylarni aniqlash va tuzatish
- Mavjud SwiftUI ilovasi uchun UI testlarini yozish
Sakkizinchi Bosqich: Ilovalarni Joylashtirish va Noshirlik
📌 Maqsad: App Store ga chiqishga tayyorlash.
🔹 O‘rganiladigan Mavzular:
- SwiftUI ilovalari uchun App Store qoidalari
- Kod imzolash va tarqatish
- Ishlab chiqarish ilovalarida SwiftUI eng yaxshi amaliyotlari
🛠 Amaliyot:
- Demo ilovasini TestFlight ga yuborish
- SwiftUI kodini ishlab chiqarishga optimallashtirish
Final Loyihasi: To‘liq SwiftUI Ilovasi Yaratish
📌 Maqsad: Barcha tushunchalarni haqiqiy loyiha asosida qo‘llash.
🔹 Final Loyihasi uchun Takliflar:
- CoreData bilan moliya kuzatuvchisi
- WebSockets bilan chat ilovasi
- Multi-Platform produktivlik ilovasi
Har bir bosqichda ishlash uchun maxsus manbalar:
//Playground yordamida example code-larni ishlatish:
import Cocoa
import SwiftUI
import PlaygroundSupport
// Create your SwiftUI View
struct ContentView: View {
@State private var text = "Hello, SwiftUI!"
var body: some View {
VStack {
Text(text)
.font(.largeTitle)
.padding()
Button("Change Text") {
text = "Text Changed!"
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
}
}
// Create the hosting controller and set it as the live view
let contentView = ContentView()
let hostingController = NSHostingController(rootView: contentView)
PlaygroundPage.current.setLiveView(hostingController)
SwiftUI 1-faza: Kirish va Asoslar
📌 Umumiy Ko'rinish
SwiftUI bu deklarativ framework bo'lib, iOS dasturchilariga minimal kod bilan barcha Apple platformalari uchun UI yaratishga imkon beradi. Ushbu bosqichda biz SwiftUI ning asosiy tushunchalarini, sintaksisini, ko'rinish tuzilishini va holat boshqaruvini o'rganamiz.
🎯 O'rganish Maqsadlari
- SwiftUI va UIKit o'rtasidagi farqlarni tushunish.
- Asosiy UI elementlarini yaratish va modifierlardan foydalanish.
@Stateva@Bindingorqali holat boshqaruvini o'rganish.HStack,VStack, vaZStackyordamida UI tuzish.- SwiftUI ning ko'rinish hayot tsiklini tushunish.
🛠 SwiftUI va UIKit taqqoslash
Xususiyat SwiftUI UIKit UI Yondashuvi Deklarativ Imperativ Jonli Ko'rish ✅ ❌ Ko'p Platformali ✅ ❌ Kod Uzunligi Qisqaroq Uzoqroq Storyboard Kerakmi? ❌ ✅
📌 SwiftUI Asosiy UI Elementlari
SwiftUI UI yaratishda ishlatiladigan asosiy elementlar quyidagilar:
Text – Matn ko'rsatish
Text komponenti UI da matnni aks ettirish uchun ishlatiladi.
Text("Salom, SwiftUI!")
.font(.largeTitle)
.foregroundColor(.blue)
.padding()
Xususiyatlari:
.font()– Matn shrift o'lchamini belgilaydi..foregroundColor()– Matn rangini o'zgartiradi..padding()– Element atrofida bo'sh joy qo'shadi.
VStack, HStack, ZStack – UI joylashuvi
VStack– Elementlarni vertikal joylashtiradi.HStack– Elementlarni gorizontal joylashtiradi.ZStack– Elementlarni bir-birining ustiga joylashtiradi.
VStack {
Text("Yuqori")
HStack {
Text("Chap")
Spacer()
Text("O'ng")
}
Text("Pastki")
}
Xususiyatlari:
.spacing()– Ichki elementlar orasidagi masofani belgilaydi..alignment()– Elementlarni tekislashni aniqlaydi.
Spacer – Bo'sh joy qo'shish
Spacer elementlar orasida bo'sh joy yaratish uchun ishlatiladi.
HStack {
Text("Chap")
Spacer()
Text("O'ng")
}
Button – Tugma yaratish
Button foydalanuvchi harakatlarini qabul qilish uchun ishlatiladi.
Button("Ko'paytirish") {
count += 1
}
Xususiyatlari:
.buttonStyle()– Tugma ko'rinishini o'zgartirish..padding()– Tugma kattaligini o'zgartirish.
Image – Rasm qo'shish
Image komponenti UI da rasmni aks ettirish uchun ishlatiladi.
Image("profile_picture")
.resizable()
.scaledToFit()
.frame(width: 100, height: 100)
Xususiyatlari:
.resizable()– Rasmni o'lchamini moslashtirish..scaledToFit()– Rasmni ekranga mos ravishda joylashtirish..frame(width:height:)– Rasm o'lchamini belgilash.
Toggle – Kalit tugma
Toggle foydalanuvchiga yoqish/o‘chirish funksiyasini taqdim etadi.
Toggle("Faollashtirish", isOn: $isOn)
Xususiyatlari:
.toggleStyle()– Kalit tugma uslubini o'zgartirish.
📌 Yakuniy Katta Misol
Ushbu kod SwiftUI ning asosiy elementlarini bir joyda jamlab, oddiy profil sahifasini yaratadi:
struct ProfileView: View {
@State private var isDarkMode = false
var body: some View {
VStack {
Image("profile_picture")
.resizable()
.scaledToFit()
.frame(width: 120, height: 120)
.clipShape(Circle())
.shadow(radius: 10)
Text("Muhriddinbek")
.font(.title)
.fontWeight(.bold)
Toggle("Tungi rejim", isOn: $isDarkMode)
.padding()
Button(action: {
print("Profil yangilandi")
}) {
Text("Yangilash")
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
}
.padding()
}
}
Bu kod:
Imageorqali profil rasmini ko'rsatadi.Textbilan foydalanuvchi ismini chiqaradi.Toggleyordamida tun rejimini yoqish/o‘chirish imkonini beradi.Buttonorqali tugma bosilganda profilni yangilaydi.
📚 Qo'shimcha Manbalar
🎯 Keyingi Qadamlar
✅ Barcha amaliy mashg'ulotlarni bajaring.
✅ VStack, Image, va Text yordamida oddiy profil sahifasini yarating.
✅ 2-faza: Kengaytirilgan UI komponentlar va navigatsiya ga tayyorlaning!
💡 Maslahat: SwiftUI ni o'rganishning eng yaxshi usuli – haqiqiy loyihalar yaratish. Turli modifierlar bilan tajriba qilib, UI elementlarga qanday ta'sir qilishini ko'ring!
SwiftUI 2-faza: Kengaytirilgan UI komponentlar va navigatsiya
📌 Umumiy Ko'rinish
Ushbu bosqichda SwiftUI ning rivojlangan imkoniyatlarini, murakkab UI komponentlarini va sahifalar o'rtasida navigatsiya qilish usullarini o'rganamiz. Shuningdek, holat boshqaruvining turli usullarini ham ko'rib chiqamiz.
🎯 O'rganish Maqsadlari
- List, ScrollView, Lazy Stacks kabi murakkab UI komponentlarini tushunish.
@State,@Binding,@ObservedObject,@EnvironmentObjectyordamida holat boshqaruvini o'rganish.NavigationView,NavigationLink,Sheet,FullScreenCoverorqali sahifalar o‘rtasida o‘tish.- UI ni optimallashtirish va qayta foydalanish imkoniyatlarini ko'rib chiqish.
📌 Murakkab UI Komponentlari
List – Ro'yxat yaratish
List bir xil turdagi elementlarni dinamik ravishda ko‘rsatish uchun ishlatiladi.
struct User: Identifiable {
let id = UUID()
let name: String
}
struct UserListView: View {
let users = [User(name: "Ali"), User(name: "Vali"), User(name: "Hasan")]
var body: some View {
List(users) { user in
Text(user.name)
}
}
}
Xususiyatlari:
Listavtomatik ravishda ma'lumotlar manbai bo‘yicha UI ni yaratadi..id(UUID())orqali har bir elementga unikallik beriladi.
ScrollView – Skroll qilinadigan kontent
ScrollView katta hajmli kontentni joylashtirish uchun ishlatiladi.
ScrollView {
VStack {
ForEach(1...50, id: \ .self) { index in
Text("Element \(index)")
.padding()
.background(Color.gray.opacity(0.2))
.cornerRadius(8)
}
}
}
Xususiyatlari:
.horizontalyoki.verticalyo‘nalishda skroll qilish mumkin..frame()bilan cheklangan o‘lcham berish mumkin.
TabView – Ko'p sahifali interfeys
TabView orqali turli sahifalar orasida oson almashish mumkin.
TabView {
Text("Bosh sahifa")
.tabItem {
Image(systemName: "house")
Text("Asosiy")
}
Text("Sozlamalar")
.tabItem {
Image(systemName: "gear")
Text("Sozlamalar")
}
}
Xususiyatlari:
.tabItem()yordamida ikon va nom qo‘shish mumkin..selectionbilan aktiv tabni belgilash mumkin.
📌 Holat boshqaruvi
@State – Lokal holat boshqaruvi
struct CounterView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Hisob: \(count)")
Button("Ko‘paytirish") {
count += 1
}
}
}
}
@Binding – Ota-komponentdan ma’lumot olish
struct ChildView: View {
@Binding var count: Int
var body: some View {
Button("Ko‘paytirish") {
count += 1
}
}
}
@ObservedObject – Bir nechta UI komponentlar o‘rtasida ma’lumot almashish
class CounterModel: ObservableObject {
@Published var count = 0
}
struct CounterView: View {
@ObservedObject var counter = CounterModel()
var body: some View {
VStack {
Text("Hisob: \(counter.count)")
Button("Ko‘paytirish") {
counter.count += 1
}
}
}
}
📌 Navigatsiya va Sahifalar o‘rtasida o‘tish
NavigationView va NavigationLink
struct MainView: View {
var body: some View {
NavigationView {
NavigationLink("Profilga o‘tish", destination: ProfileView())
}
}
}
Sheet – Modal oynani ochish
struct ContentView: View {
@State private var showSheet = false
var body: some View {
Button("Modal ochish") {
showSheet.toggle()
}
.sheet(isPresented: $showSheet) {
Text("Bu modal oynadir")
}
}
}
📚 Qo'shimcha Manbalar
🎯 Keyingi Qadamlar
✅ List, ScrollView, TabView yordamida UI yaratish.
✅ @State, @Binding, @ObservedObject orqali holat boshqaruvini tushunish.
✅ 3-faza: Animatsiyalar va Maxsus UI effektlar ga tayyorlaning!
💡 Maslahat: Murakkab UI komponentlar bilan ishlashda, har bir element qanday ishlashini tushunish uchun kichik loyihalar yarating va kodni tajriba qilib ko‘ring!
SwiftUI 3-faza: Holat Boshqaruvi va Ma'lumot Oqimi
📌 Umumiy Ko'rinish
SwiftUI dagi eng muhim jihatlardan biri bu holat boshqaruvi va ma'lumot oqimi. Ushbu bosqichda biz @State, @Binding, @ObservedObject, @EnvironmentObject kabi mexanizmlarni chuqur o‘rganamiz va ma'lumotlarni turli UI komponentlar orasida qanday uzatishni tushunamiz.
🎯 O'rganish Maqsadlari
- Holat boshqaruvi tushunchasini mukammal tushunish.
- @State, @Binding, @ObservedObject, @EnvironmentObject farqlarini bilish.
- ViewModel va ObservableObject yordami bilan ma'lumotlarni boshqarish.
- Ma'lumot oqimi va reaktiv dasturlash tamoyillarini tushunish.
- Amaliy kod yozish va real loyihalarda qanday qo‘llashni o‘rganish.
📌 SwiftUI Holat Boshqaruvi Turlari
SwiftUI dagi holat boshqaruvi bir necha darajalarga bo‘linadi:
Holat turi Qachon ishlatiladi? @State Lokal, oddiy o‘zgaruvchilar uchun @Binding Ota komponentdan qiymat olish uchun @ObservedObject Ko‘p UI komponentlar orasida almashinadigan ma’lumotlar uchun @EnvironmentObject Katta loyihalar uchun, global ma'lumotlarni boshqarish
📌 @State – Lokal holat boshqaruvi
@State faqat bitta View ichida ishlatiladi va oddiy qiymatlarni saqlash uchun qo‘llaniladi.
struct CounterView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Hisob: \(count)")
Button("Ko‘paytirish") {
count += 1
}
}
}
}
Xususiyatlari:
- Lokal holatni saqlaydi va UI o‘zgarishini kuzatadi.
- Faqat o‘sha View doirasida ishlaydi.
- Ko‘p komponentlar orasida bo‘lishish mumkin emas.
📌 @Binding – Ota komponentdan qiymat olish
Agar ota View-da @State bo‘lsa va biz uni bola View-ga yubormoqchi bo‘lsak, @Binding ishlatamiz.
struct ParentView: View {
@State private var count = 0
var body: some View {
ChildView(count: $count)
}
}
struct ChildView: View {
@Binding var count: Int
var body: some View {
Button("Ko‘paytirish") {
count += 1
}
}
}
Xususiyatlari:
@Bindingota View-dagi@Stateni o‘zgartirishga imkon beradi.- Mutatsiya qilish mumkin, lekin o‘zida holat saqlamaydi.
- Faqat bitta daraja yuqoridagi View bilan ishlaydi.
📌 @ObservedObject – ViewModel bilan ishlash
Katta loyihalarda @State yetarli emas, chunki UI va biznes logika ajratilishi kerak. ViewModel yaratish uchun @ObservedObject ishlatiladi.
class CounterViewModel: ObservableObject {
@Published var count = 0
}
struct CounterView: View {
@ObservedObject var viewModel = CounterViewModel()
var body: some View {
VStack {
Text("Hisob: \(viewModel.count)")
Button("Ko‘paytirish") {
viewModel.count += 1
}
}
}
}
Xususiyatlari:
@Publishedorqali o‘zgarishlar UI-ga reaktiv tarzda aks etadi.@ObservedObjectorqali bir nechta View o‘rtasida almashinishi mumkin.- ViewModel ma'lumotni saqlash va logikani ajratish uchun ishlatiladi.
📌 @EnvironmentObject – Katta loyihalar uchun
Agar butun loyihada global ma'lumotlar saqlash kerak bo‘lsa, @EnvironmentObject ishlatiladi.
class UserSettings: ObservableObject {
@Published var username = "Guest"
}
struct ParentView: View {
@StateObject var settings = UserSettings()
var body: some View {
ChildView().environmentObject(settings)
}
}
struct ChildView: View {
@EnvironmentObject var settings: UserSettings
var body: some View {
Text("Foydalanuvchi: \(settings.username)")
}
}
Xususiyatlari:
@EnvironmentObjectorqali ko‘p View-larga ma'lumot uzatiladi.@StateObjectyordamida asosiy View-da yaratiladi.- Katta loyihalar uchun tavsiya etiladi.
📚 Qo'shimcha Manbalar
🎯 Keyingi Qadamlar
✅ @State, @Binding, @ObservedObject, @EnvironmentObject bilan ishlash.
✅ ObservableObject va ViewModel yaratish.
✅ 4-faza: Animatsiyalar va Maxsus UI Effektlar ga tayyorlaning!
💡 Maslahat: SwiftUI ning holat boshqaruvi bilan tajriba o‘tkazing. Turli usullarni qo‘llab, UI qanday o‘zgarishini ko‘ring!
To‘rtinchi Bosqich: Ma'lumotni Ko‘rsatish va SwiftUI bilan Bog‘lash
📌 Maqsad: SwiftUI-da ma'lumotni ko‘rsatish va ularni interaktiv tarzda bog‘lash.
🔹 O‘rganiladigan Mavzular:
- SwiftUI-da ma'lumotni ko‘rsatish: Views va Data Binding
@State,@Binding,@ObservedObject, va@EnvironmentObjectyordamida ma'lumotni bog‘lash- Dinamik ro‘yxatlar va filtrlangan ma'lumotlar
- SwiftUI va CoreData integratsiyasi
Ma'lumotni Ko‘rsatish va Binding
🔹 Asosiy Mavzular:
@State: Bir nechta qiymatlarni ko‘rsatish va yangilash@Binding: Ustun yoki komponentdan boshqa komponentlarga qiymat uzatish@ObservedObject: O‘zgarmas ma'lumotlar bilan ishlash va interaktiv ko‘rsatish@EnvironmentObject: Global holatlarni bir nechta view'larda ishlatish
🛠 Amaliyot:
@State: View ichidagi lokal holatlarni saqlash va yangilash:
struct ContentView: View {
@State private var temperature: Double = 72.0
var body: some View {
VStack {
Text("Temperature: \(temperature)°F")
Button("Increase Temperature") {
temperature += 1
}
}
}
}
Binding va Reaktiv Holat
🔹 Asosiy Mavzular:
@Bindingyordamida bir view dan boshqasiga ma'lumot uzatish@Binding: View dan ma'lumotni o‘zgartirish
🛠 Amaliyot:
@Bindingyordamida ikki taraflama bog‘lash:
struct ParentView: View {
@State private var isOn: Bool = false
var body: some View {
ToggleView(isOn: $isOn)
}
}
struct ToggleView: View {
@Binding var isOn: Bool
var body: some View {
Toggle(isOn: $isOn) {
Text("Turn on/off")
}
}
}
Ma'lumotni Dinamik Ko‘rsatish va Alamofire Bilan Integratsiya
🔹 Asosiy Mavzular:
- Alamofire orqali ma'lumot olish va SwiftUI da ko‘rsatish
- Dinamik ro‘yxatlar yaratish va
ForEachyordamida ularni ko‘rsatish
🛠 Amaliyot:
- Alamofire yordamida API chaqiruvini amalga oshirib, olingan ma'lumotlarni
ForEachbilan ko‘rsatish:
import Alamofire
struct ContentView: View {
@State private var cities: [String] = []
var body: some View {
List(cities, id: \.self) { city in
Text(city)
}
.onAppear {
fetchCities()
}
}
func fetchCities() {
let url = "https://api.example.com/cities"
AF.request(url).responseDecodable(of: [String].self) { response in
switch response.result {
case .success(let fetchedCities):
self.cities = fetchedCities
case .failure(let error):
print("Error fetching cities: \(error.localizedDescription)")
}
}
}
}
CoreData va SwiftUI Integratsiyasi
🔹 Asosiy Mavzular:
- CoreData orqali ma'lumot saqlash va SwiftUI bilan integratsiya qilish
- CoreData’dan ma'lumot olish va SwiftUI da ko‘rsatish
🛠 Amaliyot:
- CoreData bilan ishlash: Alamofire yordamida olingan ma'lumotlarni CoreData bazasiga saqlash va SwiftUI da ko‘rsatish:
import CoreData
struct ContentView: View {
@FetchRequest(
entity: City.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \City.name, ascending: true)]
) var cities: FetchedResults<City>
var body: some View {
List(cities, id: \.self) { city in
Text(city.name ?? "Unknown City")
}
.onAppear {
fetchAndSaveCities()
}
}
func fetchAndSaveCities() {
let url = "https://api.example.com/cities"
AF.request(url).responseDecodable(of: [String].self) { response in
switch response.result {
case .success(let fetchedCities):
saveCitiesToCoreData(fetchedCities)
case .failure(let error):
print("Error fetching cities: \(error.localizedDescription)")
}
}
}
func saveCitiesToCoreData(_ cities: [String]) {
let context = persistentContainer.viewContext
for city in cities {
let newCity = City(context: context)
newCity.name = city
}
try? context.save()
}
}
Tavsiya Etuvchi Manbalar:
Key Takeaways:
- Alamofire yordamida ma'lumotlarni olish va SwiftUI bilan ko‘rsatish.
@State,@Binding,@ObservedObject, va@EnvironmentObjectyordamida ma'lumotlarni ko‘rsatish va bog‘lash.- CoreData bilan integratsiya qilib, ma'lumotlarni saqlash va SwiftUI da interaktiv tarzda ko‘rsatish.