- 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.
Rahmat, men Nick, bu Swiftful Thinking va keyingi videoda ko'rishguncha!