Məzmuna keç
Educora
Orta16 dəq4 / 14

Opsionallar: qiymət olmaya da bilər

Swift-də «qiymət yoxdur» vəziyyətini opsionallar ilə təhlükəsiz idarə et: `nil`, `if let`, `guard let`, `??` və opsional zəncirləmə.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Opsional tipin (Int?, String?) və nil-in nə olduğunu izah etmək
  • Opsionalı if let və guard let ilə təhlükəsiz açmaq
  • ?? ilə ehtiyat qiymət vermək və ?. ilə opsional zəncirləmə qurmaq

Telefonundakı kontaktlardan bəzilərinin e-poçt ünvanı var, bəzilərinin yoxdur. İstifadəçi yaş xanasına «15» əvəzinə «on beş» yaza bilər — bu mətni ədədə çevirmək mümkün deyil. Proqramlar hər gün belə «qiymət yoxdur» hallarla qarşılaşır. Bir çox dildə bu, gözlənilməz çökmələrə səbəb olur, Swift isə bunun üçün xüsusi alət təklif edir — opsionallar.

Opsional nədir?

Tərif
Opsional

Ya müəyyən tipdə qiymət saxlayan, ya da heç nə saxlamayan (nil) tip. Tipin adından sonra sual işarəsi ilə yazılır: Int? — «ya Int, ya da nil».

Adi Int dəyişəni heç vaxt boş ola bilməz — Swift buna zəmanət verir. Qiymət olmaya bilərsə, tip opsional elan olunur. Məsələn, Int("42") sətri ədədə çevirməyə çalışır və nəticə Int? tipindədir, çünki çevirmə alınmaya da bilər.

Swift
let age = Int("42")
let wrong = Int("hello")
var middleName: String? = nil
middleName = "Ali"

print(age)
print(wrong)
print(middleName)
Gözlənilən nəticə
Optional(42)
nil
Optional("Ali")

Diqqət et: opsional çap olunanda qiymət Optional(...) «qutusunun» içində görünür, Xcode isə sarı xəbərdarlıq göstərir. Qutudakı qiymətdən istifadə etmək üçün onu əvvəlcə açmaq (ingiliscə unwrap) lazımdır. age + 1 birbaşa yazılmır, çünki Int? ilə Int-i toplamaq olmaz.

`if let` və `guard let` ilə açmaq

if let yoxlayır: opsionalın içində qiymət varsa, onu yeni sabitə yazır və blokun içini icra edir; nil-dirsə, else bloku işləyir. İçəridəki number artıq adi Int-dir.

Swift
let input = "15"

if let number = Int(input) {
    print("Next year you will be \(number + 1).")
} else {
    print("That is not a number.")
}

let nickname: String? = nil
if let nickname {
    print("Hi, \(nickname)!")
} else {
    print("No nickname yet.")
}
Gözlənilən nəticə
Next year you will be 16.
No nickname yet.

guard let əksinə işləyir: qiymət yoxdursa, else bloku icra olunur və o, mütləq koddan çıxmalıdır (return, break və ya continue ilə). Qiymət varsa, açılmış ad guard-dan sonra bütün kodda istifadə oluna bilər. Adətən funksiyalarda işlədilir — funksiya öz adı olan kod blokudur, onu ayrıca dərsdə ətraflı öyrənəcəksən.

Swift
func greet(_ name: String?) {
    guard let name else {
        print("Hello, guest!")
        return
    }
    print("Hello, \(name)!")
    print("Your name has \(name.count) letters.")
}

greet("Aysel")
greet(nil)
Gözlənilən nəticə
Hello, Aysel!
Your name has 5 letters.
Hello, guest!

`??` və opsional zəncirləmə

?? operatoru ehtiyat qiymət verir: sol tərəfdə qiymət varsa, o götürülür, nil-dirsə — sağ tərəfdəki qiymət. ?. isə opsional zəncirləmədir: opsionalın xassəsinə və ya metoduna yalnız qiymət olanda müraciət edir, nil olanda isə bütün ifadə sakitcə nil qaytarır.

Swift
let savedName: String? = nil
let displayName = savedName ?? "Anonymous"
print(displayName)
print(Int("abc") ?? 0)

let email: String? = "leyla@example.com"
let noEmail: String? = nil
print(email?.count)
print(noEmail?.count)
print(email?.uppercased() ?? "no email")
print(noEmail?.uppercased() ?? "no email")
Gözlənilən nəticə
Anonymous
0
Optional(17)
nil
LEYLA@EXAMPLE.COM
no email

Diqqət et: email?.count adi Int deyil, Int? qaytarır — zəncirdə bir halqa nil ola bilərsə, nəticə də opsional olur. Ona görə ?. və ?? çox vaxt birlikdə işlədilir.

ÜsulNə edirTəhlükəsizdirmi?
if let x = optqiymət varsa, bloku icra edirbəli
guard let x = opt else { … }qiymət yoxdursa, koddan çıxırbəli
opt ?? defaultnil əvəzinə ehtiyat qiymət verirbəli
opt?.propertyyalnız qiymət olanda müraciət edirbəli
opt!zorla açır; nil olsa, proqram çökürxeyr
Opsionalı açmağın yolları

Əsas fikirlər

  • T? tipi ya T tipli qiymət, ya da nil saxlayır; adi tiplər heç vaxt nil olmur.
  • if let qiymət varsa bloku icra edir; guard let qiymət yoxdursa koddan çıxır.
  • ?? nil əvəzinə ehtiyat qiymət verir: Int("abc") ?? 0 → 0.
  • ?. zəncirləmənin nəticəsi də opsionaldır.
  • ! ilə zorla açma nil-də proqramı çökdürür — ondan qaç.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Int("25") ifadəsinin tipi nədir?