Swift Dili ve Opsiyonel Kavramı

Her dil ya da ‘framework’ü özel kılan bir yan bulunur. Swift için de bu özellik sanırım “opsiyonel” kavramı olmalı. Swift dilinde değişken ve sabitler opsiyonel olarak tanımlanabilir. Hatta metin kutusu gibi bir yerden değer geliyorsa mutlaka opsiyonel tanımı yapılır. Çünkü değer gelip gelmeyeceğini bilemeyiz.

Opsiyonel tanımlamak için değişken ya da sabitin sahip olacağı veri türünün yanına bir soru işareti — ? — koyarız. Örneğin aşağıdaki gibi bir Int? tanımlayarak şunu demek istiyoruz: Bu değişken ya da sabit Int türünden bir değer içerebilir ama hiç bir şey içermeyedebilir.

Çok önemli bir detayı tekrar etmek istiyorum: “Bir opsiyonel, ya veri türü belli olan bir değere eşit olabilir ya da hiç birşeye eşit olmaz.” Yani ileride bir değer alacaksa onun türü önceden belirlenmelidir.

Tabi hayat bu kadar kolay değil. Böyle bir özellik varsa belli kullanım kuralları da var. Swift’te tecrübe kazanırken en önemli aşamalardan birisi opsiyonelleri doğru kullanabilmektir. Bir opsiyoneli kullanabilmek için onu çözmemiz (unwrapping) gerekir. Bunun için değişken ya da sabitin yanına bir ünlem işareti — ! — koyulur.

Yukarıdaki kodun çıktısı “Tanımlanan değişken = \n” şeklinde olacaktır. Burada asıl dikkatinizi çekmek istediğim kısım değişkenin kullanımı. Değişken ilklendirilmemiş olsaydı nil değeri döndürecekti. Yani hiç bir değer tutmuyor olacaktır. Eğer bir değişken ya da sabitin değeri nil ise o opsiyoneli çözemeyiz. Opsiyonelin bir değer tutup tutmadığını kullanmadan önce test etmeliyiz. Özellikle Apple kalite standartları gereği programların çökmemesi gerekir. Program içinde çözülmeye çalışılan bir opsiyonel nil değer döndürürse kullanıcı tarafında çökmüş gibi gözükecektir. Apple uygulamayı reddeder.

Şu soru aklınıza geliyordur: “Her değişken kullanacağımız zaman if döngüsü mü yazacağız?”. Aslında opsiyonel kullanımı için bir kaç teknik mevcut. Bir değeri başka bir değere atarken o değişken ya da sabiti kullanmış olmuyoruz. Şu anda anlattığım tekniğe Opsiyonel Bağlama (Optional Binding) deniyor.

Bu kısımda kafanız biraz karışabilir. baglamaDegiskeni adında bir opsiyonel oluşturuyoruz. Sonra bu değeri atananSabit adındaki bir sabite atıyoruz. Yukarıda söylediklerime göre atananSabit sabitinin opsiyonel olmaması normal. Ama son satırda baglamaDegiskeni değişkenini çözmeden kullandık. Çünkü atama işlemi sırasında baglamaDegiskeni opsiyoneli çözüldü ve alt satırlarda opsiyonel değil. Buna Dolaylı Çözülme (Implicitly Unwrapping) deniyor.

Opsiyonellerle ilgili konuşulacak şeyler elbette daha fazla. Şimdilik bu kadar yeterli diye düşünüyorum. Swift’in gelecekteki pozisyonu düşünülürse bir an önce tecrübe kazanılması gereken bir dil.