# SwiftUI Interview Savollari va Javoblari (Junior - Senior)

Ushbu qo'llanmada SwiftUI framework'i bo'yicha eng ko'p so'raladigan **40 ta savol va javoblar** daraja bo'yicha jamlangan. SwiftUI bugungi kunda iOS intervyularining eng muhim mavzularidan biriga aylangan.

---

## 1. SwiftUI Asoslari (Junior daraja)

### 1. SwiftUI nima va u UIKit'dan nimasi bilan farq qiladi?
**Javob:** SwiftUI — Apple tomonidan 2019 yilda taqdim etilgan **deklarativ** UI framework. UIKit'da "qanday qilish kerak" (imperativ) yozilsa, SwiftUI'da "nima ko'rinishi kerak" (deklarativ) yoziladi. SwiftUI kamroq kod, real-time preview va cross-platform (iOS, macOS, watchOS, tvOS) qulayligini beradi.

### 2. `@State` nima va u qanday ishlaydi?
**Javob:** `@State` — View'ga tegishli mahalliy (local) ma'lumotni saqlash uchun property wrapper. U o'zgarganda SwiftUI avtomatik ravishda faqat bog'langan View'larni qayta chizadi (re-render). `@State` faqat oddiy qiymatlar (String, Int, Bool) uchun ishlatiladi va doimo `private` bo'lishi tavsiya etiladi.

### 3. `@Binding` nima va qachon ishlatiladi?
**Javob:** `@Binding` — bola (child) View'ga ota (parent) View'dagi `@State` ma'lumotiga ikki tomonlama bog'lanish berish. Bola View'da qiymat o'zgarganda, ota View'da ham o'zgaradi. `$` prefiksi bilan uzatiladi.

### 4. `VStack`, `HStack`, `ZStack` nima?
**Javob:**
*   `VStack` — Vertikal joylashuv (yuqoridan pastga).
*   `HStack` — Gorizontal joylashuv (chapdan o'ngga).
*   `ZStack` — Ustma-ust joylashuv (Z o'qi, masalan, rasm ustiga matn qo'yish).

### 5. SwiftUI'da `List` va `ForEach` farqi?
**Javob:**
*   `List` — scroll qilinadigan ro'yxat yaratadi (UITableView analogi). Avtomatik separatorlar va stillar bilan keladi.
*   `ForEach` — massiv elementlari bo'ylab iteratsiya qilib, har biri uchun View yaratadi. U mustaqil scroll bermaydi, konteyner ichida ishlatiladi.

### 6. `.modifier` nima va qanday ishlaydi?
**Javob:** View modifier — bu View'ga stil yoki xususiyat qo'shuvchi funksiya. Masalan: `.font()`, `.foregroundColor()`, `.padding()`, `.background()`. Har bir modifier yangi View qaytaradi (chaining imkoniyati).

### 7. `NavigationStack` va `NavigationLink`?
**Javob:**
*   `NavigationStack` (iOS 16+) — ekranlar orasida navigatsiya yaratish uchun konteyner. Eski `NavigationView` o'rniga ishlatiladi.
*   `NavigationLink` — bosilganda boshqa ekranga o'tkazadigan element.

### 8. `.sheet` va `.fullScreenCover` farqi?
**Javob:**
*   `.sheet` — ekranning bir qismini qoplaydi, pastga surish bilan yopiladi.
*   `.fullScreenCover` — butun ekranni to'liq qoplaydi, faqat dasturiy (programmatic) ravishda yopiladi.

### 9. `@Environment` property wrapper?
**Javob:** Tizim darajasidagi (system-level) ma'lumotlarni o'qish uchun: masalan, `\.colorScheme` (dark/light mode), `\.dismiss` (ekranni yopish), `\.locale` (til). Apple tomonidan taqdim etilgan global sozlamalar.

### 10. `Image` va `AsyncImage` farqi?
**Javob:**
*   `Image` — assetsdan yoki tizimdan (SF Symbols) rasm ko'rsatadi.
*   `AsyncImage` (iOS 15+) — URL orqali internetdan rasmni asinxron yuklaydi va ko'rsatadi. Placeholder va error holatlarini qo'llab-quvvatlaydi.

---

## 2. SwiftUI O'rta Daraja (Middle)

### 11. `@StateObject` va `@ObservedObject` farqi?
**Javob:**
*   `@StateObject` — View bu obyektning **egasi** (owner). View qayta render qilinsa ham obyekt saqlanib qoladi.
*   `@ObservedObject` — View bu obyektni **tashqaridan** oladi. View qayta render qilinsa, obyekt ham yangidan yaratilishi mumkin. Qoida: View o'zi yaratsa `@StateObject`, tashqaridan kelsa `@ObservedObject`.

### 12. `@EnvironmentObject` qanday ishlaydi?
**Javob:** Butun View daraxtida (hierarchy) ma'lumotni uzatish. Ota View'da `.environmentObject(viewModel)` deb inject qilinadi, istalgan ichki View'da `@EnvironmentObject var vm: MyViewModel` deb olinadi. Props drilling'dan qutqaradi.

### 13. `@Published` va `ObservableObject` tushunchasi?
**Javob:** `ObservableObject` — classni SwiftUI kuzatishi (observe) uchun belgilash. `@Published` — o'sha class ichidagi property o'zgarganda barcha subscriber'larga xabar berish. Bu MVVM arxitekturasining asosi.

### 14. `@ViewBuilder` nima?
**Javob:** Bir nechta View'ni bitta blok ichida qaytarish imkonini beruvchi result builder. Custom View yaratishda content parametrini qabul qilish uchun ishlatiladi. SwiftUI'ning `body` property'sining o'zi ham `@ViewBuilder`.

### 15. `GeometryReader` nima va qachon kerak?
**Javob:** Parent View'ning o'lchami va koordinatalarini bilish uchun konteyner. Foiz asosida layout (masalan, ekran kengligining 50%) yoki scroll offset'ni aniqlashda ishlatiladi. Lekin ortiqcha ishlatish performansga ta'sir qiladi.

### 16. `PreferenceKey` nima?
**Javob:** Bola View'dan ota View'ga ma'lumot yuborish mexanizmi (odatda ma'lumot yuqoridan pastga oqadi, bu esa teskarisini amalga oshiradi). Masalan, ichki View'ning balandligini ota View'ga xabar berish uchun ishlatiladi.

### 17. SwiftUI animatsiyalari: `withAnimation` vs `.animation`?
**Javob:**
*   `withAnimation { ... }` — aniq qaysi State o'zgarishi animatsiya bilan kuzatilishini nazorat qiladi (explicit).
*   `.animation(.default, value:)` — View'ga biriktirilib, value o'zgarganda avtomatik animatsiya qo'shadi (implicit).

### 18. `@Namespace` va `matchedGeometryEffect` nima?
**Javob:** Ikki View o'rtasida silliq (smooth) o'tish animatsiyasi yaratish uchun. Masalan, ro'yxatdagi element bosilganda uni batafsil ekranga "uchib o'tish" effekti berish. Hero animation deb ham ataladi.

### 19. `task` modifier nima?
**Javob:** View paydo bo'lganda asinxron ishni boshlash uchun SwiftUI modifier. `onAppear` + `Task` kombinatsiyasining toza ko'rinishi. View yo'qolganda task avtomatik bekor qilinadi (cancel).

### 20. SwiftUI Preview nima va u qanday ishlaydi?
**Javob:** Xcode'da kodni o'zgartirish bilan bir vaqtda UI natijasini real-time ko'rish. `#Preview` macro'si (Swift 5.9+) yoki eski `PreviewProvider` protokoli orqali sozlanadi. Har xil qurilma, dark/light mode va tillar uchun alohida preview qilish mumkin.

---

## 3. SwiftUI Ilg'or Daraja (Senior)

### 21. `@Observable` macro (iOS 17+) va `ObservableObject` farqi?
**Javob:** `@Observable` — yangi Observation framework'ining asosi. Farqlari:
*   `@Published` yozish shart emas, barcha property avtomatik kuzatiladi.
*   SwiftUI faqat **o'zgangan property bilan bog'langan** View'ni yangilaydi (surgical updates).
*   `@StateObject` o'rniga oddiy `@State` ishlatiladi.

### 22. SwiftUI Rendering mexanizmi (Body re-computation)?
**Javob:** SwiftUI `body`ni qayta hisoblaydi, lekin butun View'ni emas, faqat o'zgargan qismini qayta chizadi (diffing algoritmi orqali). Lekin murakkab View hierarchy'da `body` qayta hisoblash sezilarli bo'lishi mumkin. `Equatable` conform qilish va kichik View'larga ajratish performance'ni yaxshilaydi.

### 23. SwiftUI Lifecycle: `App`, `Scene`, `View`?
**Javob:**
*   `@main struct MyApp: App` — ilovaning kirish nuqtasi.
*   `Scene` — oynaning kontenti (WindowGroup, DocumentGroup).
*   `View` — alohida interfeys bo'lagi. UIKit'dagi AppDelegate/SceneDelegate o'rnini egallaydi.

### 24. Custom Layout (iOS 16+)?
**Javob:** `Layout` protokoli orqali `VStack`, `HStack` dan tashqari o'z joylashuv qoidalaringizni yaratish. `sizeThatFits` va `placeSubviews` metodlarini implementatsiya qilish orqali elementlarni ixtiyoriy tartibda joylashtirish mumkin.

### 25. `@MainActor` va SwiftUI threading qoidasi?
**Javob:** SwiftUI'dagi barcha View property'lari va `body` Main Thread'da ishlaydi. ViewModel'ga `@MainActor` qo'yish orqali uning barcha ishlarini Main Thread'da bajarilishini kafolatlash mumkin. Background ishlar uchun `Task.detached` yoki alohida Actor ishlatiladi.

### 26. UIKit Interoperability: `UIViewRepresentable`?
**Javob:** SwiftUI ichida UIKit View'lardan foydalanish uchun. `makeUIView`, `updateUIView` va `Coordinator` metodlarini implementatsiya qilish bilan UIKit elementlarini (MKMapView, WKWebView) SwiftUI'ga o'rash mumkin.

### 27. SwiftUI Navigation — Programmatic Routing?
**Javob:** `NavigationStack(path:)` va `navigationDestination(for:)` orqali butun navigatsiya stack'ini programmatik boshqarish. Coordinator pattern'ni SwiftUI'da qo'llash uchun enum-based routing ishlatiladi.

### 28. `ScrollViewReader` va `LazyVGrid`?
**Javob:**
*   `ScrollViewReader` — scroll pozitsiyasini programmatik boshqarish (masalan, chat'da eng pastga otish).
*   `LazyVGrid/LazyHGrid` — elementlarni griddagidek joylashtirib, faqat ekranda ko'ringanlarini render qiladi (UICollectionView analogi).

### 29. SwiftUI Performance Optimization?
**Javob:**
*   Kichik, mustaqil View'larga ajratish (body re-computation'ni kamaytirish).
*   `@State` va `@StateObject` ni to'g'ri joyda e'lon qilish.
*   `LazyVStack/LazyHStack` ishlatish (katta ro'yxatlar uchun).
*   `Equatable` conformance qo'shish.
*   Image'lar uchun `.resizable()` va `.scaledToFit()` ishlatish.

### 30. `TipKit` (iOS 17+) nima?
**Javob:** Apple'ning yangi framework'i bo'lib, foydalanuvchilarga ilova ichidagi funksiyalar haqida "tip" (maslahat) ko'rsatish uchun ishlatiladi. Foydalanuvchi harakatlariga (event'lar va qoidalarga) asoslanib, to'g'ri paytda maslahatni ko'rsatadi.

---

## 4. Real-World SwiftUI Savollari

### 31. MVVM patternini SwiftUI'da qanday qo'llaysiz?
**Javob:**
*   **Model:** Ma'lumot strukturasi (Struct).
*   **ViewModel:** `@Observable` (yoki `ObservableObject`) class, biznes logika va API chaqiruvlari.
*   **View:** SwiftUI View, faqat ko'rsatish.

### 32. SwiftUI'da xatoliklarni (error) qanday ko'rsatasiz?
**Javob:** `.alert(isPresented:)` yoki `.alert(item:)` modifier'lari orqali. ViewModel'da `@Published var errorMessage: String?` saqlash va View'da uni `.alert` ga bog'lash — keng tarqalgan yondashuv.

### 33. Dark Mode qo'llab-quvvatlashning to'g'ri usuli?
**Javob:** `Color` asset catalog'da "Any Appearance" va "Dark" variantlarini qo'shish. Kod ichida `@Environment(\.colorScheme)` orqali aniqlash. Qattiq rang kodlaridan qochish va `.primary`, `.secondary` kabi semantik ranglar ishlatish.

### 34. SwiftUI'da Pagination (Sahifaviy yuklash)?
**Javob:** `List` yoki `LazyVStack` ichida oxirgi element paydo bo'lganda (`onAppear`) keyingi sahifani yuklash. ViewModel'da `currentPage` va `isLoading` holatlari saqlanadi.

### 35. SwiftUI'da Custom Transitions?
**Javob:** `.transition()` modifier orqali elementlarning paydo bo'lish va yo'qolish animatsiyalarini boshqarish (`.opacity`, `.slide`, `.scale`). `AnyTransition.asymmetric` orqali kirish va chiqish uchun har xil animatsiya berish.

### 36. `@FocusState` nima?
**Javob:** TextField'lar orasida fokusni (cursor) boshqarish uchun property wrapper. Masalan, login formida "Email" maydonidan "Parol" maydoniga avtomatik o'tish yoki tugma bosilganda klaviaturani yashirish.

### 37. `confirmationDialog` va `alert` farqi?
**Javob:**
*   `alert` — oddiy xabar va 1-2 tugma (OK/Cancel).
*   `confirmationDialog` — action sheet ko'rinishida bir nechta variant taqdim etadi (masalan, "O'chirish", "Tahrirlash", "Bekor qilish").

### 38. SwiftUI va Core Data integratsiyasi?
**Javob:** `@FetchRequest` property wrapper orqali Core Data'dan ma'lumotlarni avtomatik olish va UI'da ko'rsatish. Ma'lumot o'zgarganda View avtomatik yangilanadi. `@Environment(\.managedObjectContext)` orqali context'ga kirish.

### 39. `searchable` modifier?
**Javob:** iOS 15+ da `List` yoki `NavigationStack` ichida qidiruv maydoni qo'shish. `.searchable(text:)` orqali foydalanuvchi kiritgan matnni ViewModel'ga bog'lash va natijalarni filterlab ko'rsatish.

### 40. SwiftUI va Combine integratsiyasi?
**Javob:** Combine publisher'larini `.onReceive()` modifier orqali View'da kuzatish. Timer, NotificationCenter yoki custom publisher'lardan kelgan eventlarga SwiftUI'da reactiv javob berish uchun ishlatiladi.

---
### Yakuniy Maslahat:
SwiftUI haqida savollar tushsa, amaliy misol bilan javob bering. Masalan, `@State` haqida so'ralganda oddiy counter ilovasini tushuntiring. Real loyihadagi tajribangizni (MVVM, API integration, Navigation) albatta qayd eting. Muvaffaqiyat tilaymiz! 🍎
