# Junior iOS Engineer - Interview Savollari va Javoblari (1-2 yil tajriba)

Ushbu qo'llanmada Junior darajadagi iOS dasturchilar uchun suhbatlarda ko'p so'raladigan **50 ta muhim savol va javoblar** jamlangan. Har bir javob sodda, tushunarli va professional tilda bayon etilgan.

---

## 1. Swift va Xotira Asoslari

### 1. `Struct` va `Class` o'rtasidagi asosiy farqlar nima?
**Javob:**
*   **Struct** — value type (qiymat turi). Stack xotirasida saqlanadi. Nusxa olinganda (tenglashtirilganda) ma'lumotning o'zi ko'chiriladi. Merosxo'rlikni (inheritance) qo'llab-quvvatlamaydi.
*   **Class** — reference type (havola turi). Heap xotirasida saqlanadi. Nusxa olinganda faqat obyektdan havola (pointer) nusxalanadi. Merosxo'r bo'lishi mumkin.

### 2. ARC (Automatic Reference Counting) nima?
**Javob:** ARC — bu Swift'da xotira bilan ishlash tizimi. U class obyektlaridan necha kishi foydalanayotganini (reference count) hisoblab boradi. Hisoblagich 0 ga teng bo'lishi bilan obyektni RAMdan o'chirib, xotirani bo'shatadi.

### 3. Retain Cycle nima va uni qanday hal qilish mumkin?
**Javob:** Retain Cycle — ikki obyekt bir-birini kuchli (strong reference) ushlab qolganda va natijada ARC ularni o'chira olmasdan xotirada qolib ketganda yuzaga keladi (Memory Leak). Buni hal qilish uchun kamida bitta havola `weak` yoki `unowned` deb e'lon qilinishi kerak.

### 4. Main Thread nima va nega u muhim?
**Javob:** Main Thread — ilovaning foydalanuvchi interfeysi (UI) bilan bog'liq barcha amallar bajariladigan asosiy oqim. UI elementlarini yangilash, tugmalarni bosish va animatsiyalar faqat main thread'da ishlashi shart. Og'ir hisob-kitoblar yoki tarmoq so'rovlarini main thread'da bajarish interfeysning qotib (freeze) qolishiga olib keladi.

### 5. Optional nima va uni xavfsiz ochish (unwrapping) yo'llari qanday?
**Javob:** Optional — bu o'zgaruvchida qiymat bo'lishi yoki bo'sh (`nil`) bo'lishi mumkinligini anglatuvchi qobiq. Uni xavfsiz ochish uchun `if let`, `guard let`, `nil-coalescing (??)` yoki `optional chaining` ishlatiladi. Sug'urib olishda (force unwrap `!`) xavfli, chunki qiymat `nil` bo'lsa, ilova crash bo'ladi.

### 6. Protocol va Delegate dizayn naqshi nima?
**Javob:**
*   **Protocol** — bu metodlar va xususiyatlar to'plami bo'lib, class yoki struct uchun "shartnoma" vazifasini o'taydi.
*   **Delegate** — bir obyekt o'zidagi ma'lumotlarni yoki hodisalar haqidagi xabarni boshqa obyektga uzatishi uchun ishlatiladigan mexanizm. Odatda `weak` holatida ishlatiladi (Retain cycle oldini olish uchun).

### 7. App Life Cycle (Ilovaning hayot sikli) bosqichlari qanday?
**Javob:**
*   **Not Running:** Ilova hali ishga tushmagan.
*   **Inactive:** Ilova ochiq, lekin UI eventlarni qabul qilmayapti (masalan, qo'ng'iroq kelganda).
*   **Active:** Ilova faol ishlamoqda.
*   **Background:** Ilova fonda (ekranda ko'rinmaydi, lekin kod ishlayapti).
*   **Suspended:** Ilovaning fondagi faoliyati to'xtatilgan, u RAMda turibdi, lekin CPU sarflamayapti.

### 8. View Controller Life Cycle bosqichlari qanday?
**Javob:**
1.  `loadView`: View'larni yaratish.
2.  `viewDidLoad`: View xotiraga yuklandi (bir marta ishlaydi).
3.  `viewWillAppear`: Ekran ko'rinish arafasida.
4.  `viewDidAppear`: Ekran to'liq paydo bo'ldi.
5.  `viewWillDisappear`: Ekran yopilish arafasida.
6.  `viewDidDisappear`: Ekran yopildi.

### 9. Frame va Bounds o'rtasidagi farq nima?
**Javob:**
*   **Frame** — elementning o'zining "ota" (superview) elementiga nisbatan joylashuvi va o'lchami.
*   **Bounds** — elementning o'z ichki koordinatalar sistemasiga nisbatan joylashuvi (odatda x:0, y:0 bo'ladi) va o'lchami.

### 10. Higher-Order Functions (`map`, `filter`, `reduce`) nima?
**Javob:** Bular massivlar (collections) ustida tezkor ishlash uchun ishlatiladigan funksiyalar:
*   `map`: Har bir elementni o'zgartirib, yangi massiv qaytaradi.
*   `filter`: Shartga mos keladigan elementlarni saralab oladi.
*   `reduce`: Barcha elementlarni yagona bitta qiymatga aylantiradi (masalan, yig'indisini topish).

---

## 2. Swift Tili Xususiyatlari

### 11. `do-catch`, `try`, `throws` nima?
**Javob:** Bular xatolarni boshqarish (error handling) uchun ishlatiladi. Funksiya xato qaytarishi mumkin bo'lsa `throws` deb ko'rsatiladi. Uni ishlatish uchun `try` so'zi bilan `do-catch` bloki ichida chaqiriladi.

### 12. Access Control (Ruxsat darajalari) turlari?
**Javob:**
*   `private`: Faqat o'sha class/struct ichida.
*   `fileprivate`: Faqat o'sha fayl ichida.
*   `internal` (default): Butun loyiha (module) ichida.
*   `public`: Tashqi loyihalar uchun ham (SPM/CocoaPods), lekin subclass qilib bo'lmaydi.
*   `open`: Eng keng ruxsat, boshqa modullarda ham subclass qilish mumkin.

### 13. Generics nima?
**Javob:** Generics har xil turdagi (type) ma'lumotlar bilan ishlay oladigan universal funksiyalar yoki turlar yaratish imkonini beradi. Masalan, bir xil logikali funksiyani ham `Int`, ham `String` uchun alohida yozmasdan, bitta umumiy `<T>` ko'rinishida yozish mumkin.

### 14. `Any` va `AnyObject` farqi?
**Javob:**
*   `Any` — istalgan turdagi ma'lumotni (int, string, struct, class, closure) qabul qiladi.
*   `AnyObject` — faqat class obyektlarini qabul qiladi.

### 15. Tuple nima?
**Javob:** Tuple — bir nechta qiymatlarni bitta guruhga yig'ish usuli. Masalan, `(404, "Not Found")`. U struct yaratmasdan turib funksiyadan bir nechta qiymat qaytarishda juda qo'l keladi.

### 16. `Enum` (Enumeration) nima?
**Javob:** Enum — o'zaro bog'liq cheklangan qiymatlar to'plami (masalan, haftaning kunlari). Swift'da enum'lar `Associated Values` (har bir case'ga qo'shimcha ma'lumot biriktirish) va `Raw Values` (case'ga boshlang'ich qiymat berish) kabi kuchli xususiyatlarga ega.

### 17. `typealias` nima?
**Javob:** Mavjud biror tur (type) uchun yangi, tushunarliroq nom (taxallus) berish. Masalan: `typealias UserID = String`. Bu kodni o'qishni osonlashtiradi.

### 18. `Extension` nima uchun ishlatiladi?
**Javob:** Mavjud class, struct, enum yoki protocolga uning original kodiga tegmagan holda yangi metodlar va xususiyatlar qo'shish uchun ishlatiladi.

### 19. Computed vs Stored properties?
**Javob:**
*   **Stored Property:** RAMda joy egallaydigan va qiymatni o'zida saqlaydigan property.
*   **Computed Property:** Qiymatni saqlamaydi, balki har safar murojaat qilinganda hisoblab qaytaradi (`get` va `set` bloklari orqali).

### 20. `lazy` o'zgaruvchi nima?
**Javob:** `lazy` deb e'lon qilingan o'zgaruvchi faqat unga birinchi marta murojaat qilingandagina xotiradan joy ajratadi va ishga tushadi. Bu unumdorlikni oshirish va ortiqcha xotira sarfini kamaytirish uchun foydali.

---

## 3. Murakkabroq Swift Tushunchalari

### 21. `static` va `class` metodlar farqi?
**Javob:** Ikkalasi ham obyekt yaratmasdan turib to'g'ridan-to'g'ri tur nomi bilan chaqiriladi. Farqi: `static` metodni subclasslarda o'zgartirib (override) bo'lmaydi, `class` metodini esa override qilish mumkin.

### 22. `final` kalit so'zi nima qiladi?
**Javob:** Class prefiksiga `final` qo'yilsa, undan hech kim meros ololmaydi. Metodlarga qo'yilsa, ularni override qilib bo'lmaydi. Bu xavfsizlik va **Static Dispatch** tufayli tezlikni oshiradi.

### 23. `deinit` nima vazifani bajaradi?
**Javob:** `deinit` — class obyekti xotiradan o'chirilishidan (deallocate) oldin avtomatik chaqiriladigan maxsus metod. Unda odatda timerlarni to'xtatish yoki bildirishnomalarni (Observer) o'chirish kabi tozalash ishlari qilinadi.

### 24. Force Unwrapping (`!`) nega xavfli?
**Javob:** Chunki u optional ichidagi qiymatni tekshirmasdan to'g'ridan-to'g'ri olishga harakat qiladi. Agar ichida qiymat bo'lmasa (nil bo'lsa), dastur darhol "Fatal error" berib crash bo'ladi. Har doim xavfsiz usullardan foydalanish tavsiya etiladi.

### 25. Nil-Coalescing Operator (`??`) nima?
**Javob:** Agar optional qiymat `nil` bo'lsa, uning o'rniga zaxira (default) qiymatni tayinlash uchun ishlatiladi. Masalan: `let name = inputName ?? "Guest"`.

### 26. Type Casting: `as`, `as?`, `as!`?
**Javob:**
*   `as`: Obyektni ota class turiga yoki mos protocolga o'tkazish.
*   `as?`: Xavfsiz o'tkazish (casting). Agar o'xshamasa `nil` qaytaradi.
*   `as!`: Majburiy o'tkazish. Agar tur mos kelmasa, crash beradi.

### 27. `Equatable` protokoli nima uchun?
**Javob:** Ikki obyektni o'zaro tengligini (`==` operatori bilan) solishtirish imkonini beradi. Buni amalga oshirish uchun qaysi property'lar bo'yicha solishtirish kerakligini ko'rsatish lozim.

### 28. `Comparable` protokoli nima?
**Javob:** Obyektlarni "katta" yoki "kichik" deb solishtirish (`<`, `>`) va ularni saralash (sort qilish) imkonini beradigan protokol.

### 29. `Hashable` nima va qayerda ishlatiladi?
**Javob:** Obyekt uchun unikal butun sonli "hash value" yaratish. Bu `Set` to'plamlarida va `Dictionary` kalitlarida (keys) elementlarni tezkor topish va dublikatlarni aniqlash uchun shartdir.

### 30. Closure nima?
**Javob:** Closure — bu kod bloklari bo'lib, ularni o'zgaruvchilarga saqlash, funksiyalarga parametr sifatida uzatish yoki qaytarish mumkin. Funkisyaning bir turi desak ham bo'ladi, lekin nomi yo'q va o'zi joylashgan atrofdagi o'zgaruvchilarni "tutib olish" (capture) xususiyatiga ega.

---

## 4. Arxitektura va UI (UIKit) Asoslari

### 31. Closure ichida `[weak self]` ishlatish nega muhim?
**Javob:** Closure'lar self'ni (class'ni) kuchli (strong) ushlab qoladi. Agar closure class ichida saqlangan bo'lsa, bu "Strong Reference Cycle"ga olib keladi. `[weak self]` orqali ushbu zanjir uziladi va xotira oqishining oldi olinadi.

### 32. Designated va Convenience Init nima?
**Javob:**
*   **Designated Init:** Asosiy init metodi bo'lib, barcha property'larni to'liq to'ldirishi shart.
*   **Convenience Init:** Yordamchi init bo'lib, ba'zi property'larga default qiymat berib, oxirida asosiy (designated) init ni chaqiradi.

### 33. Failable Initializer (`init?`) nima?
**Javob:** Agar obyekt yaratishda xatolik yuz bersa (shartlar bajarilmasa), obyekt yaratilmasdan `nil` qaytarishi mumkin bo'lgan init turi.

### 34. `mutating` kalit so'zi nima uchun kerak?
**Javob:** Struct va Enum'lar value type bo'lgani uchun, ularning metodlari ichida o'z xususiyatlarini (properties) o'zgartirishiga ruxsat berilmaydi. Buning uchun metod oldidan `mutating` qo'yilishi shart.

### 35. `inout` parametri nima?
**Javob:** Odatda funksiyaga uzatilgan o'zgaruvchilar o'zgarmas (let) bo'ladi. Agar funksiya ichida o'zgaruvchini tahrirlab, tashqaridagi original qiymatni ham o'zgartirmoqchi bo'lsak, `inout` kalit so'zidan foydalanamiz.

### 36. `defer` bloki nima qiladi?
**Javob:** Funksiya ichidagi barcha kodlar bajarilib bo'lgandan so'ng, eng oxirida (hatto xato bo'lsa ham) ishlaydigan kod bloki. Odatda fayllarni yopish yoki resurslarni tozalashda ishlatiladi.

### 37. `Array`, `Set` va `Dictionary` farqi?
**Javob:**
*   **Array:** Tartiblangan ro'yxat, dublikat elementlar bo'lishi mumkin.
*   **Set:** Tartiblanmagan to'plam, faqat unikal (takrorlanmas) elementlar bo'ladi.
*   **Dictionary:** Kalit va qiymat (Key-Value) juftligi. Kalitlar doim unikal bo'ladi.

### 38. Programmatic UI vs Storyboard?
**Javob:**
*   **Storyboard:** Vizual chizish oson, lekin katta jamoada Git'da ishlashda "Merge Conflict" ko'p bo'ladi.
*   **Programmatic UI:** Barcha dizayn kodda yoziladi. Git bilan ishlash oson, kodni qayta ishlatish (reusability) qulayroq.

### 39. `IBOutlet` va `IBAction` nima?
**Javob:** Storyboard'dagi dizayn elementlarini koddagi class bilan bog'lash:
*   `IBOutlet`: UI elementini (Label, Button) o'zgaruvchi sifatida bog'laydi.
*   `IBAction`: Tugma bosilishi kabi amallarni metod sifatida bog'laydi.

### 40. Auto Layout va Constraints nima?
**Javob:** Ilovadagi UI elementlarining har xil o'lchamdagi ekranlarda to'g'ri joylashishini ta'minlovchi tizim. Constraints — bu elementlarning kengligi, bo'yi yoki joylashuviga qo'yiladigan "chegaralar" (shartlar).

---

## 5. Qo'shimcha Texnik Savollar

### 41. Safe Area nima?
**Javob:** Bu ekran ichidagi "xavfsiz" qism bo'lib, u yerdagi kontent status bar, home indicator yoki "notch" kabi tizim elementlari ostida qolib ketmaydi.

### 42. Content Hugging va Compression Resistance nima?
**Javob:**
*   **Content Hugging:** Element o'z kontentidan ko'ra kattalashib ketmasligi uchun (ichkariga tortish kuchi).
*   **Compression Resistance:** Element siqilib ketishi oqibatida kontenti ko'rinmay qolmasligi uchun (tashqariga qarshilik kuchi).

### 43. `UIStackView` vazifasi?
**Javob:** Elementlarni vertikal yoki gorizontal qator qilib joylashtirishda ishlatiladi. U avtomatik tarzda barcha constraints'larni boshqaradi va elementlarni qo'shish yoki o'chirishni osonlashtiradi.

### 44. `UITableView` qanday qilib unumdorlikni (performance) oshiradi?
**Javob:** "Cell Reuse" (hujayralarni qayta ishlatish) mexanizmi orqali. Minglab ma'lumotlar bo'lsa ham, faqat ekranda ko'rinib turadigan sanoqli hujayralarni yaratadi va ular ekrandan chiqishi bilan yangi ma'lumotlar uchun qayta ishlatadi.

### 45. UserDefaults nima uchun ishlatiladi?
**Javob:** Foydalanuvchining kichik hajmdagi sozlamalarini (settings), masalan tilni tanlashi yoki dark/light mode sozlamasini doimiy saqlash uchun ishlatiladigan sodda ma'lumotlar bazasi.

### 46. Keychain va UserDefaults farqi?
**Javob:** `UserDefaults` xavfsiz emas (oddiy fayl), `Keychain` esa maxfiy ma'lumotlar (parollar, API tokenlar) uchun mo'ljallangan Apple tomonidan shifrlangan xavfsiz ombor.

### 47. URLSession nima?
**Javob:** Apple'ning tarmoq bilan ishlash (HTTP so'rovlar yuborish va ma'lumotlarni qabul qilish) uchun mo'ljallangan asosiy framework'i.

### 48. JSONDecoder nima qiladi?
**Javob:** Serverdan kelgan JSON formatidagi ma'lumotlarni Swift'dagi Struct yoki Class obyektlariga (Codable orqali) avtomatik o'tkazib beradi.

### 49. Static Dispatch va Dynamic Dispatch nima?
**Javob:** Bu protsessor qaysi metodni chaqirishni qachon hal qilishi:
*   **Static:** Kompilyatsiya vaqtida ma'lum bo'ladi (tezroq).
*   **Dynamic:** Dastur ishlab turgan vaqtda (runtime) aniqlanadi (biroz sekinroq, lekin moslashuvchan).

### 50. NotificationCenter vs Delegate farqi?
**Javob:**
*   **Delegate:** Birma-bir (one-to-one) aloqa.
*   **NotificationCenter:** Birma-ko'p (one-to-many) aloqa. Bir joydan yuborilgan xabarni bir nechta joyda tinglash (observe qilish) mumkin.

---

## 6. SwiftUI Asoslari va Amaliy Savollar

### 51. SwiftUI nima va UIKit'dan farqi?
**Javob:** SwiftUI — bu Apple tomonidan yaratilgan deklarativ UI framework. UIKit'da "qanday qilish kerak" ko'rsatilsa (imperativ), SwiftUI'da "nima ko'rinishi kerak" yoziladi (deklarativ). SwiftUI kamroq kod bilan tezroq natija beradi.

### 52. `@State` va `@Binding` farqi?
**Javob:**
*   `@State`: View ichida mahalliy ma'lumotni saqlash va o'zgarganda UI'ni qayta chizish.
*   `@Binding`: Bola (child) view'ga ota (parent) view'dagi `@State` ma'lumotiga ikki tomonlama bog'lanish berish.

### 53. `VStack`, `HStack`, `ZStack` nima?
**Javob:**
*   `VStack`: Elementlarni vertikal (yuqoridan pastga) joylashtiradi.
*   `HStack`: Elementlarni gorizontal (chapdan o'ngga) joylashtiradi.
*   `ZStack`: Elementlarni ustma-ust (Z o'qi) joylashtiradi.

### 54. `NavigationView` va `NavigationLink` nima qiladi?
**Javob:** `NavigationView` (iOS 16+ da `NavigationStack`) ekranlar o'rtasida o'tish (navigatsiya) imkoniyatini beradi. `NavigationLink` esa bosilganda boshqa ekranga o'tkazadigan tugma vazifasini bajaradi.

### 55. `Codable` va JSON Parsing nima?
**Javob:** `Codable` = `Encodable + Decodable`. Serverdan kelgan JSON formatidagi ma'lumotni Swift Struct'ga avtomatik o'tkazish (`JSONDecoder`) va aksincha Struct'dan JSON'ga aylantirish (`JSONEncoder`) uchun ishlatiladi.

### 56. Property Observers: `willSet` va `didSet`?
**Javob:** O'zgaruvchi qiymati o'zgarishidan **oldin** (`willSet`) va **keyin** (`didSet`) ma'lum bir kodni bajarish. Masalan, slider qiymati o'zgarganda UI'ni yangilash.

### 57. `@Published` va `ObservableObject` nima?
**Javob:** `ObservableObject` — class'ni SwiftUI kuzatishi uchun belgilash. `@Published` — o'sha class ichidagi o'zgaruvchi o'zgarganda UI'ni avtomatik qayta chizishni ta'minlaydi.

### 58. `ForEach` va `List` nima?
**Javob:**
*   `List`: Scroll qilinadigan ro'yxat (UITableView analogi).
*   `ForEach`: Ma'lumotlar massivi bo'ylab iteratsiya qilish va har bir element uchun view yaratish.

### 59. Git'da `commit`, `branch`, `merge` nima?
**Javob:**
*   **Commit:** Kodning "surati" (snapshot) — bir paytdagi holatni saqlash.
*   **Branch:** Asosiy koddan mustaqil ravishda yangi funksiya (feature) ustida ishlash uchun "shoxcha".
*   **Merge:** Branchdagi ishni asosiy kodga qo'shib birlashtirish.

### 60. `@Environment` nima?
**Javob:** SwiftUI tizimidan global sozlamalarni (masalan, color scheme — dark/light mode, calendar, locale) o'qib olish uchun ishlatiladigan property wrapper.

### 61. `onAppear` va `onDisappear` nima?
**Javob:** SwiftUI'da View ekranda paydo bo'lganda (`onAppear`) yoki yo'qolganda (`onDisappear`) kod bajarish uchun ishlatiladigan view modifier'lar. UIKit'dagi `viewDidAppear` va `viewDidDisappear` ga o'xshash.

### 62. `ternary operator` (?) nima?
**Javob:** `if-else`ning qisqa ko'rinishi: `shart ? ha_qiymat : yo'q_qiymat`. Masalan: `let status = age >= 18 ? "Katta" : "Kichik"`. Kodni qisqartiradi va oson o'qiladi.

### 63. `String Interpolation` nima?
**Javob:** String ichiga o'zgaruvchilarni kiritish usuli: `"Salom, \(name)!"`. Bu qo'shimcha `+` operatorlaridan foydalanmasdan toza va tushunarli stringlar yaratishga yordam beradi.

### 64. `GCD` (Grand Central Dispatch) asosiy tushunchasi?
**Javob:** Apple'ning ko'p oqimli (multithreading) dasturlash tizimi. `DispatchQueue.main` — UI ishlari uchun, `DispatchQueue.global()` — og'ir ishlarni fonda bajarish uchun ishlatiladi.

### 65. `.sheet` va `.fullScreenCover` farqi?
**Javob:** Ikkalasi ham yangi ekranni modal qilib ochadi. `.sheet` — ekranning bir qismini qoplaydi (pastga surish bilan yopiladi). `.fullScreenCover` — butun ekranni to'liq qoplaydi.

---
### Yakuniy Maslahat:
Suhbat davomida nafaqat terminlarni ayting, balki ularni oddiy hayotiy misollar bilan tushuntirishga harakat qiling. SwiftUI haqida so'ralganda oddiy misol kod yozib ko'rsatishdan qo'rqmang. Muvaffaqiyat tilaymiz! 🎯
