Swift 5.3 Optional (Opsiyonlar Kavramı)

Değişkenler konusunda fazla ilerlemeden opsiyonlar konusunu kesinlikle kavramamız gerekiyor.Kelime anlamıyla boş referasnlar olarak bilinen optional kavramı Swift dilinin temel yapı taşını oluşturur.

Peki Neden Buna İhtiyaç Duyarız ?

Öncelikle optinal olmak ne demek onu anlamak lazım.Bir değerin eğer boş gelme ihtimali varsa ve biz onu optinal olarak tanımlamadıysak program beklenmedik bir durumla karşılaşacak ve çökecektir.İşte gelen referasn boş gelme ihtimali varsa bunu Xcode üzerinden bildirmem gerekiyor.Örneğin bir String değişkenim var ve içinde “Merhaba Dünya” adında bir value olabilir . Ama olmayadabilir ? Her zaman o String değerinin içi dolu olacak veya o String değerin içine son kullanıcı veri girecek diye bişi yok.Hatta sunucu bazlı bir proje geliştiryorsam sunucu tarafından çekilemeyen bir veri de olabilir.İşte bu tip durumlarda bu kavrama ihtiyaç duyarız.

Hangi Durumda Optinal Kullanabilirim ?

Bu size kalmış .Şöyle diyelim mesela beni ne kadar tanıyorsunuz ? Ben kahve sever miyim ? Belki de kahve’den nefret ediyorum belki her sabah kahvesiz yapamıyorum.Bu durumda bir kesinlik yok . O zaman beni bir değişken olarak tanımlamaya kalksanız optinal olarak tanımlamanız doğru olucaktır.Mesela 2 sayıyı toplamamız gerekiyor bunu yapabilmemiz için 2 sayının orda olması gerekiyor aksi halde yapamyız.

Şimdi bir örnek yapalım.

  • Myfonksiyon isminde bir fonksiyon tanımladım ve bu fonksiyon String bir veri almakta.Fonksiyon içinde 1 adet String koydum bile.
  • Nice ! İf let yapısı ile myfonksiyondan gelen String değeri myisim isimli local değişkenime atadım.Ardından gelen değeri farklı bir String ile birleştirerek ekrana bastım.
  • Else ile de bir deger gelmeme durumunda ne olacağını belirttim.

Burada ne görüüyoruz “?” ile biz burada bir değişkenin veya bir durumun optinal olduğunu yanı buraya bir değer geleblir veya gelmeyebilir bak bilgin olsun şeklinde belirtebiliyorum.Şimdi bakalım bir değer göndermeyelim neler olucak? Bakın program çökmedi işte burada optinal olarak tanımladığım için çökme problemi çıkmadı. Var isim: String? şeklinde bir değer tanımladığımda bu bir optinal bir değişkendir ve ilk doğduğunda nill değerini alır.Yeni bir değer atanana kadar nill olarak kalır.Burada da nil değeri atandı ve if let sorgusunda baktık ki bunun için boş bu yüzden else bloğu çalıştı .

Not : Nil ifadesini optinal olmayan bir değişken üzerinde kullanmazsanız .Nill atamak için optinal olma durumu şarttır.Bakınız:

Guard Let Kavramına Giriş

Aslında optinal kavramında çok sık if let ve guard let kullanımı göreceğiz.O yüzden bu ikisinin arasında kı farkta neymiş bir bakalım.

İf-let aslında isteğe bağlı ifadeleri de eğer bir değer açıyorsa kullanılır.Guard-Let ise let ile kontrol başarısız olduğunda geçerli işlevden döngüden veya çıkmak üzere tasarlanmıştır.Şimdi bakalım:

  • Uyesayısı isimli fonksiyonum burada yanlızca 0 haricinde bir değer alırsa çalışır.
  • Oysa bunu guard let kullanarak yapsaydık ?

Guard let ile :

  • Şimdi burada sonuç aynı ama konu o değil 🙂
  • Burada işlevimiz uyesayısına odaklanmamıza sağlıyor.Her şey doğru ise üyesayınıbas fonksiyonu çalışıyor aslında.
  • Guard kullanıldığı zaman geçerli kapsamdan çıkmamızı gerektirir.Bu durumda başarısız olursa işlevden dönmemiz gerekir.
  • Guard yöntemlerinde başlangıcından bir veya daha fazla kez kullanıldığınızda görmek yaygındır.Çünkü koşulların önceden doğru olduğunu doğrulamak için kullanılır.Bu sebeple kodumuzun daha doğru bir şekilde okunmasıını sağlar.
  • Bir koşıulu kontrol etmeye sonra bir kod çalıştırmaya daha sonra da başka bir koşulu kontrol etmeye ve farklı bir kod çalıştırcak.
  • Bu sebeple if let yalnızca bazı opsiyonları açmak istiyorsanız kullanmanız gerek.Ancak guard let ile devam etmeden önce koşulların dogru olup olmadığını özellikle kontrol etmemiz gereken durumlarda tercih edin.

Şimdi boş bir değer gönderiyorum ve guard let yönteminin ne yaptığını görebilmek adına adım print fonksiyonlarımı ekledim.

Unwrap Optionals (Zorunlu Opsiyonlar)

Şimdi standart optional ile var olmayan verilere yani veri gelmeme durumlarında erişimi engelleyip programın çökmesine engel olmuştuk.Şimdi birde zorunlu opsiyon olarak çevrilen Unwrap değişken olarak nitelendirdiğimiz kavram var.Fakat şöyle bir durum var.Unwrap olarak tanımladığım bir değişkene eğer veri gelmezse her zaman programın çökme ihtimali var.Bu yüzden kesin olarak verinin geleceği kavramlarda bunu kullanmak gerekir.”!” ile unwrap özelliğini kazandırıyoruz.

Ex:

  • URL burada elle yazılmış bir url ve bundan eminim.
  • URL2 ise başka bir yerden bir değer ile birleştirilerek oluşturulmuş.Ayrıca unwrap olarak etiketleniş yani burada ısrarla şunu diyorum buraya kesin bir değer gelecek.

Peki ya gelmediği durumlarda ?

Veri gelmediği durumlarda olan şey çok açık.Program kesinlikle çökecektir.İşte bu yüzden unwrap kullanırken kesinlikle verinin gelmesi gerektiği ve geleceğinde %99 emin olduğunuz durumlarda kullanmak gerekir.Bakınız veri göndermedim:

Implicitly Unwrapped Optionals (İsteğe Bağlı Zorunlu Opsiyonlar)

Normal opsiyonlar gibi aslında bir değer içerebilir veya nill bir değer yani boş bir değerde alabilir.Burada isteğe bağlı zorunlu opsiyon kullanırken ise tip beliryecimin sonuna “!” koyurak tanımlıyorum.Bu zamana kadar ki opsiyonlarda nill değeri alıdğında sistem çöküyordu burada ise durum farklı.Bazen bazı değişkenler hayata sıfır olarak başlaması gerekmektedir.Yani nill olarak başlamak zorunda olabilir.Yani burada şunu anlıyorum mutlaka nill bile olsa bir değer olmalı.Burada if let ve guard let kullanmaya gerek yoktur.

Nill Coalescing

Nill Coalescing aslında çok işe yarar bir durum.İsteğe bağlı bir değişken nill yanı sıfır degerini içeriyorsa ona varsayılan bir değer sağlar.Bu durum bize esneklik sağlar.Mesela bir chat uygulaması yazıyoruz ve kullanıcının kaydettiği mesajı taslaklara kaydetmeye çalışıyor.İşte tamda bu durum için.Burada eğer fonksiyondan bir sonuç gelmiyorsa default olarak “Boş Mesaj” String ögesini kullanır .

Sözlükler üzerinde bu örnege bakarsak böyle bir key yoksa veya default bir değer ayarlayabilirim ama sözlüklerde zaten default olarak bir parametre ekleyebiliyoruz zaten işte bu zevk meselesidir.Tercih size kalmış.

Optional Chaining (İsteğe Bağlı Zincirleme) 

İsteğe bağlı zincirleme ile tek bir kod satırında birkaç katmanı inceleyebilirim.

  • Mysözlük adı altında bir sözlük tanımladım.
  • Ardından myalbümadı altında bir değişken yaptım.Amacım burada albüm ismine göre bir sıralama yapmak.Albüm isimlerinin ilk harfine göre nereye yerleştirilmesini gerektiğini bulmak için bunu kullanıcam.
  • İşte burada isteğe bağlı bir zincirleme işlemi kullandık.Çünkü burada mysozluk içinde belkide Medcezir değeri yoktu biz onu bilemezdik .Ayrıca yinede albüm adının ilk karakterini okurken dizenin boş olmasıda mümkün olabilir.Yani burada ilk harfi okuyamazsak zaten sıfır olarak dönecektir.

Optional Try(İsteğe Bağlı Deneme)

Bir atma fonksiyonu tanımlarken aslında do,try, ve cath kullanabilirim.Ama Swift dilinde try?bir alternatifdir..Bu işlevde eğer işlev başarılı olursa dönüş değeri normalde geri aldığınız şeyi içeren isteğe bağlı bir değer olucaktır.Başarısız olursa eğer dönüş değeri isteğe baplı olarak sıfır olarak set edilecek.İsteğe bağlı deneme yöntemini kullanmak hem avantaj hemde dezavantajı olabilir.Burada sistem şu sizin için hatanın ne kadar önemli olduğuna odaklanmak.Bu işlevi çalıştırdğınızda yanlızca başarılı olup olmadığına dikkat etmek istiyorsanız neden başarısız olduğunun nedenlerı arasında ayrım yapmanıza gerek yoktur.

Burada standart yöntemlerden farklı olarak sonuç return ederken isteğe bağlı olarak döner.

Leave a Reply

*