Published on

Swift-da Optional-larni xavfsiz ochish β€” if let va guard let

Authors

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 letguard let
NatijaBir xilBir xil
Else joyiPastdaYuqorida
returnShart emasMajburiy
Qachon ishlatishO'rta qismda tekshirishdaFunksiya boshida tekshirishda
Kod ko'rinishiIchki blokYassi, 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.

Rahmat, men Nick, bu Swiftful Thinking va keyingi videoda ko'rishguncha!

Buy mea coffee