Published on

Swiftda Optionals

Authors

Swiftda optional — bu qiymatga ega bo‘lishi yoki umuman qiymatga ega bo‘lmasligi (nil) mumkin bo‘lgan maxsus turdir.

Oddiy ma’noda optionalni qutiga solingan poyabzal deb tasavvur qiling. Quti bo‘sh bo‘lishi yoki ichida poyabzal bo‘lishi mumkin. Qutini ochmasdan turib unda poyabzal bor-yo‘qligini bilolmaysiz.

Optional qanday e’lon qilinadi?

Optionalni e’lon qilish uchun turdan keyin ? yoki ! qo‘shiladi.

var someValue: Int?
var someAnotherValue: Int!

print(someValue)
print(someAnotherValue)

Natija:

nil
nil

? va ! ikkisi ham optional yaratadi, lekin ularning ishlashida katta farq bor (quyida tushuntirilgan).

Optionalga qiymat berish va olish

let someValue: Int? = 5
print(someValue)
print(someValue!)

Natija:

Optional(5)
5

print(someValue) → optionalning o‘zi: Optional(5)

print(someValue!) → optionalni majburiy ravishda ochish (force unwrap) → 5

Majburiy unwrap (!) faqat qiymat albatta mavjud ekanligiga 100% ishonganingizda ishlatiladi.

Majburiy ochiladigan optional (Implicitly Unwrapped Optional)

let someValue: Int! = 5
print(someValue)

Natija:

5

Int! → avtomatik unwrap qilinadi. Har safar ! qo‘shish shart emas.

Lekin bunda ham qiymat doim mavjud bo‘lishi shart, aks holda dastur xato bilan to‘xtaydi.

Fatal error misoli

var someValue: Int!
var unwrappedValue: Int = someValue // CRASH!

Xato:

fatal error: unexpectedly found nil while unwrapping an Optional value

Sabab: someValue ichida nil bor, lekin kod uni majburiy unwrap qilyapti.

Optional Handling (Optionallarni to‘g‘ri ishlatish)

Optional qiymatni ishlatish uchun uni unwrap qilish kerak. Force unwrap (!) xavfli, shuning uchun Swift xavfsiz usullarni taklif qiladi.

Quyida 4 xil usul ko‘rsatilgan:

1. If-statement bilan tekshirish

var someValue: Int?
var someAnotherValue: Int! = 0

if someValue != nil {
    print("Qiymat mavjud: \(someValue!)")
} else {
    print("Qiymat yo‘q")
}

if someAnotherValue != nil {
    print("Qiymat mavjud: \(someAnotherValue!)")
} else {
    print("Qiymat yo‘q")
}

Natija:

Qiymat yo‘q
Qiymat mavjud: 0

Kamchiligi: baribir ! bilan unwrap qilish talab qilinadi.

2. Optional Binding (if let) — eng xavfsiz usul

var someValue: Int?
var someAnotherValue: Int! = 0

if let temp = someValue {
    print("Qiymat mavjud: \(temp)")
} else {
    print("Qiymat yo‘q")
}

if let temp = someAnotherValue {
    print("Qiymat mavjud: \(temp)")
} else {
    print("Qiymat yo‘q")
}

Natija:

Qiymat yo‘q
Qiymat mavjud: 0

if let optionalni xavfsiz ochadi va qiymatni tempga joylaydi.

3. guard let bilan unwrap qilish

Funksiya ichida yanada qulay.

func testFunction() {
    let someValue: Int? = 5
    guard let temp = someValue else {
        return
    }
    print("Qiymat mavjud: \(temp)")
}

testFunction()

Natija:

Qiymat mavjud: 5

guard — qiymat bo‘lmasa tezda chiqadi, bo‘lsa davom etadi.

4. Nil-coalescing operator (??)

Optional bo‘sh bo‘lsa, default qiymat tanlanadi.

var someValue: Int!
let defaultValue = 5
let unwrappedValue: Int = someValue ?? defaultValue
print(unwrappedValue)

Natija:

5

Yana bir misol:

var someValue: Int? = 10
let defaultValue = 5
let unwrappedValue: Int = someValue ?? defaultValue
print(unwrappedValue)

Natija:

10

?? operatori optionalda qiymat bo‘lsa uni qaytaradi, bo‘lmasa default qiymatni.