SwiftUI RoadMap 2025

SwiftUI RoadMap 2025

Muhriddinbek Samidov

Tajribali 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:

  1. Apple SwiftUI Documentation
  2. SwiftUI Tutorials on Hacking with Swift
  3. SwiftUI by Example


//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.
  • @State va @Binding orqali holat boshqaruvini o'rganish.
  • HStack, VStack, va ZStack yordamida 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:

  • Image orqali profil rasmini ko'rsatadi.
  • Text bilan foydalanuvchi ismini chiqaradi.
  • Toggle yordamida tun rejimini yoqish/o‘chirish imkonini beradi.
  • Button orqali 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, @EnvironmentObject yordamida holat boshqaruvini o'rganish.
  • NavigationView, NavigationLink, Sheet, FullScreenCover orqali 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:

  • List avtomatik 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:

  • .horizontal yoki .vertical yo‘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.
  • .selection bilan 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

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:

  • @Binding ota View-dagi @State ni 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:

  • @Published orqali o‘zgarishlar UI-ga reaktiv tarzda aks etadi.
  • @ObservedObject orqali 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:

  • @EnvironmentObject orqali ko‘p View-larga ma'lumot uzatiladi.
  • @StateObject yordamida 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 @EnvironmentObject yordamida 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:

  • @Binding yordamida bir view dan boshqasiga ma'lumot uzatish
  • @Binding: View dan ma'lumotni o‘zgartirish

🛠 Amaliyot:

  • @Binding yordamida 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 ForEach yordamida ularni ko‘rsatish

🛠 Amaliyot:

  • Alamofire yordamida API chaqiruvini amalga oshirib, olingan ma'lumotlarni ForEach bilan 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 @EnvironmentObject yordamida ma'lumotlarni ko‘rsatish va bog‘lash.
  • CoreData bilan integratsiya qilib, ma'lumotlarni saqlash va SwiftUI da interaktiv tarzda ko‘rsatish.



Report Page