Optional / Nullable — əsas anlayışlar və nullable tiplərlə iş

Müəllif: IT Sectr Dərc olunub: 2026-05-26 Oxuma vaxtı: 8 dəq

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 tipi, iki case-li enum kimi təqdim olunur: some(Value) və none.
  • Nullable — Kotlin-də tipdən sonra sual işarəsi ilə işarələnir (String?), təhlükəsiz çağırış isə ?. vasitəsilə.
  • Type safety — hər iki mexanizm null dəyərlərin kompilasiya mərhələsində açıq şəkildə işlənməsini təmin edir.
  • Unwrapping — Swift if let, guard let və force unwrap (!) istifadə edir. Kotlin — ?., !! və elvis operatoru ?:.
  • Interop — Kotlin və Swift nullable kod bazası ilə annotasiyalar və xüsusi tiplər (Implicitly Unwrapped Optional) vasitəsilə qarşılıqlı əlaqədə olur.

Optional və Nullable nədir?

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: sintaksis və opsional tiplərlə iş

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 və guard-let bağlaması

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

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 operatoru

?? (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.

swift
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: təhlükəsiz çağırışlar və elvis operatoru

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ış ?.

?. — 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.

Elvis operatoru ?:

?: — 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 və !! operatoru

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.

kotlin
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!!

Optional və Nullable: yanaşmaların əsas fərqləri

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.

Tip sistemində təmsil

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ı.

Sintaksis və ifadəlilik

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.

SsenariSwiftKotlin
Bəyannaməvar name: String?val name: String?
Təhlükəsiz çağırışname?.countname?.length
Defolt dəyərname ?? "Guest"name ?: "Qonaq"
Şərti çıxarmaif let x = namename?.let { x -> }
Force unwrapname!name!!

Mobil inkişafda null-safety nümunələri

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.

Optional-da map və flatMap

Swift və Kotlin Optional və nullable üçün mapflatMap-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.

Elvis vasitəsilə defolt dəyərlə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ə.

Compose və SwiftUI-də Nullable

Jetpack ComposeSwiftUI-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.

kotlin
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@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.

Optional və Nullable ilə işdə tipik səhvlər

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.

  • Zəmanətsiz Force unwrap — name! və ya name!! dəyərin null olmadığına əmin olmadan production-da crash-a səbəb olur. Force unwrap-dan əvvəl null-u yoxlayın.
  • Həddindən artıq if-let — üç və daha çox Optional üçün iç-içə if-let „pyramid of doom" yaradır. Guard let və ya flatMap istifadə edin.
  • Nil-coalescing-i göz ardı etmək — if-let və else bloku ilə açıq yoxlama ?? və ya ?: ilə əvəz olunur, bu da kodu qısaldır və oxunaqlılığı artırır.
  • Public API-lərdə Nullable — funksiya nullable qəbul edərsə, hər çağırış yoxlama tələb edir. Defolt dəyər və ya overload ilə non-null-a üstünlük verin.

Tez-tez verilən suallar

Kotlin Nullable Swift Optional-dan nə ilə fərqlənir?

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 null-safety varmı?

Java-da daxili null-safety yoxdur. Optional (Java 8+) Swift Optional-ın analoqudur, lakin bu, əlavə xərcli sarıcıdır. @Nullable@NonNull annotasiyaları statik analizatora kömək edir, lakin təhlükəsizliyə zəmanət vermir.

Nə vaxt if-let əvəzinə Kotlin-də ?.let istifadə etməli?

?.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.

Optional performansa necə təsir edir?

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.

Data class sahələri üçün nullable istifadə etməyə dəyər?

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ə

  • Optional (Swift) və Nullable (Kotlin) — null emalını kompilasiya mərhələsinə keçirən və NPE-nin qarşısını alan dil mexanizmləri.
  • Swift Optional — pattern-matching və map/flatMap təmin edən iki case-li enum. Kotlin nullable — yığcam operatorları ?., ?:, !! olan tip sisteminin hissəsi.
  • Optional chaining (Swift ?.) və təhlükəsiz çağırış (Kotlin ?.) iç-içə yoxlamalar olmadan iyerarxik məlumatlarla işləməyə imkan verir.
  • Nil-coalescing (??) və elvis operatoru (?:) açıq if-else budaqları olmadan defolt dəyərlər təmin edir.
  • Smart cast Kotlin-də yoxlamadan sonra nullable-ı avtomatik non-null-a çevirir, açıq çevirmələrin sayını azaldır.
  • Production-da force unwrap (! / !!), həddindən artıq if-let və lazımsız public API-lərdə nullable tiplərdən çəkinin.

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.

Layihəni müzakirə et

Həm də oxuyun