Closures-2

emre gürses
3 min readMay 27, 2021

--

Swift dilinde closures yapısı hakkındaki detaylandırmaya devam edeceğiz.

Öncelikle tekrar ederek başlamak gerekirse; Closures :kod blogu olarak aktarılabilen, fonksiyona parametre geçebilen bağımsız bloklardır. Başka dillerdeki lambda ifadelere benzerdirler. Swift’ten önce kullanılan Objective-C dilinde buna en çok benzeyen ise “block” yapısıydı.

Closure aslında bir fonksiyonunu ve işlevini daha az kod ile daha temiz şekilde yazılması olarak bakmak gerekiyor. Parametre isimlerini $0, $1 şeklinde verebiliyorken, fonksiyonun ismini yazmadan sadece yapılacak işi en kısa ve sade gösterme yöntemi olarak karşımıza çıkıyor.

Closure örneği verirken bugüne kadar hep kendimiz yazmıştık. Aslında default olarak Apple kütüphanesi tarafından bize sağlanan bazı closure olduğunu ve bunları çokça kullandığımızı bilmemiz gerekiyor. Bunlara genelde yüksek seviyeli fonksiyonlar olarakta ifade ediyoruz. Bilinen bazılarını ve çalışma yapısına değinmek gerekirse:

sorted() ve sorted(by:): bu fonksiyonlar, aynı türde elemanları olan bir diziyi argüman olarak alıp, belirli bir düzende sıralayıp geriye yeniden sıralanmış bir array geriye döndürür.

sorted(): isim listesini alıp, alfabetik olarak sıralayıp yeni array geri döndürür.

sorted(by:): parametre olarak bir closure alabilir. Bu fonksiyonda 2 parametre alıp geriye bu parametreleri karşılaştırıp true/false dönebilecek bir fonksiyon olacaktır. Yada ileride göreceğimiz şekilde açık bir şekilde closure fonksiyon yazmadan bulunduğu satırda aynı işlemleri yapabileceğiz.

Yukarıdaki örnekte, backward isminde fonksiyonu ayrıca yazmak yerine aşağıdaki gibi kolayca kullanabilirdik. Bu kullanım şekline Implicit Closure yani açık açık ifade ettiğimiz kullanım diyoruz. Dikkat edeceğiniz üzere aşağıda alacağı 2 parametreye s1 ve s2 isimlendirmesi kullandık, bunları karşılaştırıp return ile geriye true/false döndürdük. Peki daha sade yazamaz mıydık?

Closure yazarken daha sade ve sadece yaptığımız işin logic kısmını anlatacak şekilde aşağıdaki gibi yazmamıza olanak sağlıyor. Zaten 2 adet parametre alacağı ve geriye tek bir değer döndüreceği için sadeleştirilmiş farklı kullanımları aşağıdaki gibi olacak şekilde kullanabiliriz. Tek satırda ayrıca bir closure/fonksiyon yazmadan yaptığımız bu işe inline closure diyoruz.

ve bildiğiniz üzere closure daha sade fonksiyon yazma sanatı olduğundan kullanacağımız parametreleri s1, s2 diye yazmadan sırasıyla $0, $1 şeklinde bizim yerimize ifadelendirdiğinden aşağıdaki kullanımların hepsi aynı sonucca çıkaracağını unutmayalım.

ÖZETLE: Swift dilinde bir closure yazarken, siz yazmazsanız bile aldığı parametrelerin türünü, geriye dönüş tipini refer(tahmin) edebilecek şekilde kullanabiliyoruz.

Traling Closure:

Eğer bir fonksiyonu parametre olarak closure verilecekse ve bu closure fonksiyonun son parametresi ise traling closure olarak kolayca aşağıdaki gibi tanımlanabilecektir. Aşağıdaki örnek fonksiyonda closure’u parametre olarak son parametrelerde alan bir örnek var.

Yukarıdaki örnek fonksiyonu kullanmak için 2 farklı yol izleyebiliriz.

  1. YOL
Closure farklı fonksiyonlar olarak kullanmak

2.YOL

Closure ile traling closure yapısı örneği.

Capturing Values

Bir closure kendi scope alanında olmasa bile sabit yada değişkenlere ulaşabilir ve bunların değerini değiştirebilir. İşte bu değer değiştirme olayına capturing value denir.

imgArrow imageView property değerine scope dışından erişim sağlanması buna bir örnektir.

--

--

emre gürses

Denizbank — Intertech, Mobil Uygulama Geliştiricisi(iOS)