Optional / Nullable — Swift və Kotlin dillərində dəyərin olmaması ilə təhlükəsiz işləmək üçün mexanizmlər. Swift-də Optional və Kotlin-də nullable tiplər bir problemi həll edir — null reference — lakin fərqli sintaktik və semantik yanaşmalarla. Swift.org, 2026 məlumatına görə, opsional tiplər nil ilə əlaqəli səhvlərin bütün sinfini aradan qaldırır, null yoxlamasını kompilasiya mərhələsinə keçirir.
Əsas məqamlar
Optional Swift-də və nullable Kotlin-də — bunlar null-u tip sisteminin açıq hissəsi edən dil vasitələridir. Swift-də Optional enum-dur: Optional.none (nil) və Optional.some(Wrapped). Kotlin-də nullable tipdə ? suffiksi ilə işarələnir: String? sətir və ya null ola bilər.
Hər iki yanaşma Toni Hoarın “milyard dollarlıq səhv" adlandırdığı fundamental problemi — null reference-ı həll edir. Opsional tiplər meydana gəlməzdən əvvəl istənilən referans null ola bilərdi və yoxlama proqramçının öhdəsinə buraxılırdı. Swift və Kotlin bu yoxlamanı kompilasiya mərhələsinə keçirir: null-u nəzərə almayan kod kompilə olunmayacaq.
Ümumi məqsədə baxmayaraq, Swift və Kotlin null-safety-ni fərqli tətbiq edir. Swift tam pattern-matching ilə Optional cəbri tipindən istifadə edir. Kotlin nullable-ı kompilator səviyyəsində tip sisteminə yerləşdirir, ayrıca sarıcı tip yaratmadan.
Tarixən null reference 1965-ci ildə ALGOL W dilində dəyərin olmamasını təmsil etmək üçün meydana çıxdı. Altı onillik ərzində null saysız-hesabsız nasazlıqların mənbəyinə çevrildi — Toni Hoarın araşdırmalarına görə, production kodunda səhvlərin 30-50 faizi NullPointerException ilə əlaqəlidir. Optional ilə Swift və nullable tipləri ilə Kotlin bu problemi tip sistemi səviyyəsində həll edən ilk əsas dillər oldu və null-u funksiya kontraktının açıq hissəsinə çevirdi.
Swift-də Optional enum Optional<Wrapped> kimi elan edilmiş tam hüquqlu tipdir. Sintaktik şəkər ? tam yazılışı əvəz edir: Int? Optional<Int>-ə ekvivalentdir. Optional ilə iş dəyərin çıxarılmasının bir neçə üsulunu əhatə edir.
if let — şərti çıxarma: Optional dəyər ehtiva edərsə, blok daxilində sabitə bağlanır. guard let — Optional nil-ə bərabərdirsə, funksiyadan erkən çıxış. guard let kodu düz edir, iç-içə if-let-lərdən qaçır.
Optional chaining (ardıcıl təhlükəsiz giriş) ? vasitəsilə Optional-da açıq unwrapping olmadan metod və ya xassəni çağırmağa imkan verir. Zəncirin hər hansı halqası nil olarsa, bütün zəncir nil qaytarır. Bu, iyerarxik məlumatlarla işləyərkən kodu qısaldır.
?? (nil-coalescing) — Optional nil deyilsə onun dəyərini, əks halda default dəyəri qaytaran operator. Bu, ehtiyat dəyər təmin etmək üçün if-let-ə qısa alternativdir.
var name: String? = "Alice"
// If-let bağlaması
if let unwrapped = name {
print("Salam, \(unwrapped)")
}
// Optional chaining
let count = name?.count
// Nil-coalescing
let display = name ?? "Qonaq"
// Optional-da map
let greeting = name.map { "Hello, \($0)" }
Kotlin-də nullable tip sisteminin bir hissəsidir, ayrıca sarıcı tip deyil. String? tipi null ehtiva edə bilər, String (sual işarəsi olmadan) — heç vaxt. Kompilator nullable-ı smart cast və annotasiyalar vasitəsilə izləyir.
?. — təhlükəsiz çağırış operatoru. Əgər obyekt null deyilsə, metod və ya xassə çağırılır; null olarsa — çağırış olmadan null qaytarılır. Bu, Swift-də optional chaining-in analoqudur, lakin sintaktik olaraq daha qısadır.
?: — nil-coalescing-in Kotlin analoqu. Əgər soldakı ifadə null deyilsə, qaytarılır; əks halda — sağdakı dəyər. Elvis operatoru tez-tez return və ya throw ilə erkən çıxışla birləşdirilir.
Smart cast — Kotlin kompilatoru if və ya when-də null yoxlamasından sonra nullable-ı avtomatik olaraq non-null-a çevirir. !! — məcburi çağırış (force unwrap), null olduqda NullPointerException atır. !!-dən yalnız null səhv olduqda istifadə edin.
val name: String? = "Alice"
// Təhlükəsiz çağırış
val length = name?.length
// Elvis operatoru
val display = name ?: "Qonaq"
// Yoxlamadan sonra smart cast
if (name != null) {
println("Uzunluq: ${name.length}")
}
// Lambda ilə let
name?.let { println("Salam, $it") }
// Force unwrap — yalnız əmin olduqda
val forced = name!!
Swift və Kotlin eyni tapşırığı həll etsələr də, onların null-safety yanaşmaları prinsipial olaraq fərqlənir. Bu fərqləri başa düşmək hər iki platformada işləyən tərtibatçılar üçün vacibdir.
Swift standart cəbri tip olan enum Optional-dan istifadə edir. Kotlin nullable-ı kompilator tip sistemi səviyyəsində yerləşdirir, sarıcı-obyekt yaratmadan. Bu, performansa təsir edir: Swift-də Optional — yığındakı obyekt, Kotlin-də nullable — allocasiyasız null yoxlaması.
Kotlin sintaksisi daxili operatorlar ?., ?:, !! sayəsində daha qısadır. Swift daha çox açıq sintaksis tələb edir: if let, guard let, map Optional-da. Lakin Swift switch vasitəsilə pattern-matching təmin edir, Kotlin bunu nullable üçün birbaşa dəstəkləmir.
| Ssenari | Swift | Kotlin |
|---|---|---|
| Bəyannamə | var name: String? | val name: String? |
| Təhlükəsiz çağırış | name?.count | name?.length |
| Defolt dəyər | name ?? "Guest" | name ?: "Qonaq" |
| Şərti çıxarma | if let x = name | name?.let { x -> } |
| Force unwrap | name! | name!! |
Mobil inkişafda şablon kodun miqdarını azaldan və təhlükəsizliyi artıran opsional tiplərlə işin standart nümunələri formalaşıb.
Swift və Kotlin Optional və nullable üçün map və flatMap-i dəstəkləyir. Əgər dəyər varsa — transformasiya tətbiq olunur, null olarsa — null qaytarılır. Bu, iç-içə if-let yoxlamalarını aradan qaldırır.
If-let + else əvəzinə defolt dəyərlə ?: və ya ?? istifadə edin. Bu, kodu deklarativ edir: „varsa X-i istifadə et, əks halda Y" prosedur yoxlama əvəzinə.
Jetpack Compose və SwiftUI-də opsional tiplər göstərilməni idarə edir: vəziyyət null olarsa — komponenti gizlət, əks halda göstər. Bu, single source of truth prinsipinə uyğundur.
data class UserState(
val name: String?,
val email: String?
)
// Müxtəlif variantlarla when-də smart cast
fun greeting(state: UserState): String = when {
state.name != null && state.email != null ->
"${state.name} (${state.email})"
state.name != null -> state.name
else -> "Qonaq"
}
// Compose: mövcudluğa görə göstərmə
@Composable
fun UserProfile(name: String?) {
name?.let {
Text(text = it)
} ?: Text(text = "Məlumat yoxdur")
}
Mövcud Java kodunu Kotlin-ə miqrasiya etmək üçün androidx.annotation paketindən @Nullable və @NonNull annotasiyalarından istifadə etmək tövsiyə olunur. Kotlin kompilatoru Java ilə interop zamanı bu annotasiyaları nəzərə alır, müvafiq tipləri avtomatik nullable və ya non-null edir. Açıq annotasiyalarla tədrici miqrasiya layihədə null-safety-nin qlobal şəkildə aktivləşdirilməsindən daha təhlükəsizdir.
Null-safety səhvlərin sayını azaldır, lakin onları tamamilə aradan qaldırmır. Tərtibatçılar tez-tez opsional tiplərlə işləyərkən xarakterik səhvlərə yol verirlər.
Tez-tez verilən suallar
Swift Optional — some və none case-ləri olan enum, yığındakı obyekt. Kotlin nullable — sarıcı yaratmadan kompilator tərəfindən yoxlanılan tip sistemindəki annotasiya. Kotlin sintaktik olaraq daha yığcam, Swift pattern-matching-də daha güclüdür.
Java-da daxili null-safety yoxdur. Optional (Java 8+) Swift Optional-ın analoqudur, lakin bu, əlavə xərcli sarıcıdır. @Nullable və @NonNull annotasiyaları statik analizatora kömək edir, lakin təhlükəsizliyə zəmanət vermir.
?.let əməliyyatlar zənciri üçün əlverişlidir: transformasiya tətbiq etmək, verilənlər bazasına yazmaq, UI-ı yeniləmək — hamısı bir blokda. if null yoxlaması ilə bir neçə nullable dəyişəni olan mürəkkəb şərtlər üçün daha yaxşıdır.
Swift Optional — böyük tiplər üçün dolayı saxlanması olan enum, bu da allocasiyalara səbəb ola bilər. Kotlin nullable — əlavə xərcsiz null yoxlaması. Hot-yollar (recycler view, animasiyalar) üçün Kotlin daha səmərəlidir.
Nullable-dən yalnız sahə həqiqətən olmaya bilərsə istifadə edin: profil üçün opsional məlumatlar, isteğe bağlı parametrlər. Sahə həmişə doldurulursa — yaratma zamanı elvis operatoru ilə defolt dəyərlə non-null istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun