- Opsional tipin (
Int?,String?) vənil-in nə olduğunu izah etmək - Opsionalı
if letvəguard letilə 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?
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.
let age = Int("42")
let wrong = Int("hello")
var middleName: String? = nil
middleName = "Ali"
print(age)
print(wrong)
print(middleName)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.
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.")
}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.
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)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.
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")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.
| Üsul | Nə edir | Təhlükəsizdirmi? |
|---|---|---|
if let x = opt | qiymət varsa, bloku icra edir | bəli |
guard let x = opt else { … } | qiymət yoxdursa, koddan çıxır | bəli |
opt ?? default | nil əvəzinə ehtiyat qiymət verir | bəli |
opt?.property | yalnız qiymət olanda müraciət edir | bəli |
opt! | zorla açır; nil olsa, proqram çökür | xeyr |
Əsas fikirlər
T?tipi yaTtipli qiymət, ya danilsaxlayır; adi tiplər heç vaxtnilolmur.if letqiymət varsa bloku icra edir;guard letqiymə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çmanil-də proqramı çökdürür — ondan qaç.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
Int("25") ifadəsinin tipi nədir?