- Published on
Swift-da Optional-larni xavfsiz ochish — if let va guard let
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Bu videoda biz xavfsiz kodlash haqida gaplashamiz. Xavfsiz kodlash = yaxshi kodlash. Optional o'zgaruvchilarni to'g'ri ochish — har qanday Swift ilovasida zarur bo'lgan ko'nikma.
Boshqa darsliklarda ! — ya'ni force unwrap ishlatilganini ko'rgan bo'lsangiz, bu videoda nima uchun bunday qilmaslik kerakligini va muqobil usullarni o'rganasiz.
Asosiy ekran sozlamasi
struct IfLetGuardBootcamp: View {
@State var displayText: String? = nil // Optional String
@State var isLoading: Bool = false
@State var currentUserId: String? = nil // Foydalanuvchi tizimga kirmaganida nil
var body: some View {
NavigationView {
VStack {
// if let — displayText nil bo'lmasa ko'rsatish
if let text = displayText {
Text(text)
.font(.title)
}
// isLoading true bo'lsa yuklash indikatori
if isLoading {
ProgressView()
}
Spacer()
}
.navigationTitle("Xavfsiz kodlash")
.onAppear {
loadData()
}
}
}
func loadData() {
// ...
}
}
if let — Optional-ni xavfsiz ochish
if let — Optional o'zgaruvchida qiymat borligini tekshiradi. Qiymat bo'lsa yangi o'zgaruvchi yaratadi, bo'lmasa blok ishlamaydi:
@State var displayText: String? = nil
// ❌ XATO — displayText nil bo'lishi mumkin
Text(displayText)
// ✅ TO'G'RI — if let bilan xavfsiz tekshirish
if let text = displayText {
// Bu blok faqat displayText nil bo'lmaganda ishlaydi
// text — Optional emas, oddiy String
Text(text)
.font(.title)
}
Force Unwrap — ! — HECH QACHON ISHLATMANG
// ❌ JUDA XAVFLI — displayText nil bo'lsa ilova ishdan chiqadi (crash)!
Text(displayText!)
// Xato xabari: "Unexpectedly found nil while unwrapping an Optional value"
// Bu xato foydalanuvchi ilovangizni ishlatayotganda ham sodir bo'lishi mumkin
! ishlatish muammoni yashiradi, hal qilmaydi. Agar nil bo'lsa — ilova crash bo'ladi. Hech qachon ! ishlatmang, har doim if let yoki guard let ishlating.
Amaliy misol — foydalanuvchi IDsi tekshiruvi
Ko'plab ilovalarda foydalanuvchi tizimga kirgan bo'lishi ham, kirmagani ham mumkin. Ma'lumot yuklashdan oldin IDni tekshirish kerak:
@State var currentUserId: String? = nil // tizimga kirmagan = nil
@State var displayText: String? = nil
@State var isLoading: Bool = false
func loadData() {
// if let bilan foydalanuvchi IDsini tekshirish
if let userId = currentUserId {
// Bu blok faqat userId nil bo'lmaganda ishlaydi
isLoading = true
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
isLoading = false
displayText = "Foydalanuvchi ID: \(userId) — yangi ma'lumotlar"
}
} else {
// userId nil — foydalanuvchi tizimga kirmagan
displayText = "Xato: foydalanuvchi IDsi yo'q"
}
}
Test:
// Tizimga kirmagan holat — nil
@State var currentUserId: String? = nil
// Natija: "Xato: foydalanuvchi IDsi yo'q"
// Tizimga kirgan holat
@State var currentUserId: String? = "testUser123"
// Natija: "Foydalanuvchi ID: testUser123 — yangi ma'lumotlar"
guard let — funksiya boshida tekshirish
guard let — if let bilan bir xil natija beradi, lekin yozilishi boshqacha. Shart bajarilmasa return bilan funksiyadan chiqiladi, bajarilsa qolgan kod ishlaydi:
func loadData2() {
// guard let — shart bajarilmasa darhol chiqib ketish
guard let userId = currentUserId else {
// currentUserId nil bo'lsa bu blok ishlaydi
displayText = "Xato: foydalanuvchi IDsi yo'q"
return // funksiyadan chiqish — qolgan kod ishlamaydi
}
// Bu qator faqat userId mavjud bo'lganda ishlaydi
// userId — Optional emas, oddiy String
isLoading = true
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
isLoading = false
displayText = "Foydalanuvchi ID: \(userId) — yangi ma'lumotlar"
}
}
if let va guard let — farqi va qachon qaysi?
// if let — tekshirish kodni o'rtasida bo'lganda
func someFunction() {
// boshqa kod ...
if let userId = currentUserId {
// faqat userId bo'lganda
}
// boshqa kod davom etadi ...
}
// guard let — funksiya boshida "eshik qo'riqchisi" sifatida
func loadData() {
guard let userId = currentUserId else {
return // shart bajarilmasa darhol chiqish
}
// Bu yerdan pastda userId doim mavjud
// Chuqur ichki blok yo'q — kod yassi va o'qilishi oson
}
if let | guard let | |
|---|---|---|
| Natija | Bir xil | Bir xil |
| Else joyi | Pastda | Yuqorida |
return | Shart emas | Majburiy |
| Qachon ishlatish | O'rta qismda tekshirishda | Funksiya boshida tekshirishda |
| Kod ko'rinishi | Ichki blok | Yassi, chuqur emas |
Nick shaxsan guard let ni afzal ko'radi — kod yassi va o'qilishi osonroq bo'ladi.
To'liq kod
struct IfLetGuardBootcamp: View {
@State var displayText: String? = nil
@State var isLoading: Bool = false
@State var currentUserId: String? = "testUser123"
var body: some View {
NavigationView {
VStack {
if let text = displayText {
Text(text)
.font(.title)
}
if isLoading {
ProgressView()
}
Spacer()
}
.navigationTitle("Xavfsiz kodlash")
.onAppear {
loadData()
}
}
}
func loadData() {
guard let userId = currentUserId else {
displayText = "Xato: foydalanuvchi IDsi yo'q"
return
}
isLoading = true
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
isLoading = false
displayText = "Foydalanuvchi ID: \(userId) — yangi ma'lumotlar"
}
}
}
Xulosa — bitta qoida eslab qoling
// ❌ HECH QACHON — force unwrap
someOptional!
// ✅ DOIM — xavfsiz ochish
if let value = someOptional { ... }
guard let value = someOptional else { return }
Ilovangizda Optional o'zgaruvchi ko'rsangiz — if let yoki guard let ishlating. ! ishlatish muammoni bir zumga yashiradi, lekin foydalanuvchi ilovangizni ishlatayotganida crash bo'lishiga sabab bo'ladi.