Yazı 4. “Optionals” ve “nil” kavramı

Selim Selçuk
4 min readOct 27, 2020

--

Öncelikle şu 3 ön bilgi önemli olabilir;
(1) Objective-C programlama dilinde Optionals kavramı yer almıyordu. Bu kavram(concept) Swift programlama dili ile sunuldu.
(2) Optionals kavramı Swift programlama dili için en güçlü özellik kabul ediliyor.
(3) Optionals kavramı sadece sınıflar için değil her tip için kullanılabilir.

Optionals kavramı nedir?
“Bir sabit ya da değişkenin değer içermeme lüksü” diyebilliriz. Bazen bu lükse sahip olmak isteyebiliriz;

Mesela internet ortamını ile etkileşimli bir uygulama düşünelim… Bazen beklediğimiz cevap gelmeyebilir.

Ya da bir diğer örnek; İsim ve soyisim değerlerini düşünelim… Kişilerin ikinci ismi de olabilir. İşte bu ikinci ismi işaret edecek değişkeni Optionals olacak şekilde tanımlayabiliriz. Çünkü iki ismi olmayan kişiler için bu ikinci ismi işaret eden değişken ile işimiz yok, bu değişken “nil” olabilir.

Optionals bir değer ya da sabit nil değilse bu değer ya da sabiti print ile yazdırdığımızda “Optional” ibaresi görürüz;

Yukarıdaki durum için “nil” örneğine de değinelim;

“nil” kavramı

Bu noktada “nil” kavramına da değinmemiz gerekiyor.
Yine önemli olabilecek bir bilgi;
Swift programlama dilindeki “nil” kavramı ile Objective-C programlama dilindeki “nil” kavramı aynı değil.

Bir değişken ya da sabitin nil olabilmesi için o değişken ya da sabitin Optional olması gerekiyor. Bir başka deyişle Optional olmayan değişken ya da sabitin kesinlikle değeri olmalıdır. Optional olmayan sabit ya da değişkene nil atayamayız. Bir başka deyişle Optional olmayan bir sabit ya da değişkeni nil mi değil mi diye kontrol etme. Şöyle bir uyarı alırsın:
Comparing non-optional value of type ‘[String]’ to ‘nil’ always returns false
yani bu kontrol her zaman false döner. Bu kontrolü yapman gereksizdir. Derleyici bunu hata(kırmızı) olarak değil uyarı(sarı) olarak işaret eder. Yani kodu derlemene engel değildir.

Değişkeni tanımlarken Int ibaresinin yanına “soru işareti” koyarak bu değişkenin Optional olacağını belirttik. Optional tanımladığımızdan dolayı 20 numaralı kod satırında bu değişkene nil ataması yapabildik.

Farz edelim ki bir değişken tanımlamak istiyoruz fakat değerini daha sonradan vermek istiyoruz. Bu durumlarda Optional tanımlaması yaparız;

İki isim örneği bu kavramın anlaşılması için yaygın kullanılan uygun bir örnek. Bu örnek ile devam edelim;
Yukarıda bahsettiğimiz gibi ikinci ismi tutacak değişkeni Optional olarak tanımlayalım;

Şimdi bu 3 değişkene “nil” atamaya çalışalım. Bunu yaptığımızda Xcode, name ve lastname değişkenlerine nil atandığı kod satırlarında nil değerlerinin altını çizip şu uyarıyı verecektir: ‘nil’ cannot be assigned to type ‘String’. Hatanın anlamı çok açık: “nil” değeri String bir tip için atanamaz. Fakat dikkat edersek secondname değişkenine nil ataması yapabildik. Bunun sebebi secondname değişkeninin Optional olması.

“type-safe language” kavramı

Bu noktada ufak bir parantez açalım; Yukarıdaki örneği işlerken Swift programlama dillinin type-safe özelliğini de görmüş olduk diyebiliriz. Xcode&Swift “nil” olamayacak değişkeni nil yapmaya çalıştığımızda kodu derlemeden bize hatayı gösteriyor. Bu sayede kod geliştirme aşamasında hataları erkenden yakalamış oluyoruz. Swift Type-Safe Programlama dilidir.

Örneğe geri dönelim;
Bu 3 değişkene nil ataması denemiştik. Bu atamaları geri alalım ve bu 3 değişkeni print ile yazdıralım;

Görüleceği üzere secondname değişken yazdırılınca output window’da bu değişken Optional ifadesi ile yazıldı. Bu durum bir sorun yaratıyor mu inceleyelim;

“fullname” adında bir sabit oluşturduk. Bu sabite isim, ikinci isim ve soyismi atadık. Xcode kodu derlememize bile izin vermedi; secondname değişkeni için şu uyarıyı verdi: “secondname” optional(String?) bir ifadedir. Bunu açmalısın. Xcode bu sorun için bize 2 çözüm sunar;

Çözüm 1:
Değişken nil gelirse default bir değer tanımla ve bu değişkeni Optional durumdan kurtar!

Çözüm 1 yukarıdaki şekilde hata verecektir. Aşağıdaki gibi parantez kullanılması gerekiyor;

Çözüm 2:
Force Unwrap. Açmaya zorla! Xcode a şu sözü veriyoruz; “Kesinlikle bu değişken nil gelmeyecek”

Değişken “nil” gelirse uygulama çökecektir.(crash)

Özetle amaç şudur;
Değişkeni ya da sabiti optional ibaresinden kurtarmak. Yani Açmak. Yani Unwrapping. Yani Optional tipleri normal tiplere çevirmek.

Bu işlem 3 yol ile yapılabiliyor;

(1) Force Unwrappping
(2) Implicit Unwrapping
(3) Optional Binding

Bir sonraki yazıda bu 3 yolun detaylı olarak anlatımını görebilirsiniz.

Referans: developer.apple.com
Makalenin yazıldığı zaman Swift versiyonu: 5.3
İyi çalışmalar.

--

--