Swift Closure Nedir?
Hoş geldiniz tıkır tıkır kod yazan eller, parmaklarınız dert görmesin. Başlamadan söyleyeyim, bu yazı kişisel bir isyan içerir. Ve inanıyorum ki bu isyanda yalnız değilim. 😅
Pek çok konuyu kavrarken büyük bir zorluk çekmedim ya da bir şekilde ilerledim, ama closure (Kapatma) konusunu bir türlü tam olarak anlamış gibi hissedemiyordum. Konuya çalışıp örnekler üzerinde ilerlerken sorun yok, ama iş kullanmaya geldiğinde problem yaşıyordum. E bu duruma artık bir son verme kararı aldım ve bu yazıyı da bu amaçla hazırladım. (Bu süreçte yalnız olmadığımı da fark edince içim biraz olsun rahatladı 😅)
Eğer siz de benim gibi hissediyorsanız okumaya devam edin. Mümkün olduğunca anlaşılır şekilde ulaştığım kaynakları derleyerek bu yazıyı oluşturdum. Ve iki parçada ele alacağım. Birincisi daha temel bilgiler içerecek. İkincisinde de öğrendiklerimizi geliştirerek ilerleyeceğiz. Yine bolca kaynak vererek derinlemesine öğrenmek isteyen arkadaşlara yol göstermeye de gayret edeceğim.
Hadi bakalım şu konunun üstesinden gelelim. 💪 İlk adım, tanım. ‘Closure nedir?’ sorusunun tanımsal cevabına Apple dokümantasyonundan bir bakalım. 👇
Kapanışlar (Closure), kodumuzda aktarılması ve paylaşılması mümkün olan bağımsız işlev bloklarıdır. Swift dilinde closure yapısı, C ve Objective-C dilindeki bloklara, başka yazılım dillerindeki lambda yapılarına benzerler. 🔗
Bu cümleyi hem Türkçe, hem de İngilizce olarak defalarca okudum ve ne yazık ki hiçbir zaman doğru dürüst bir şey ifade etmedi. 😅
Bu yüzden ben de aşağıda daha anlaşılır bulduğum bazı tanımları peşpeşe bir araya getirdim.
Closure Nedir:
- Closure’lar ismi olmayan, parametre alabilen, geriye değer döndürebilen, bir değişkende saklanabilen ve bir fonksiyona parametre olarak iletilebilen kod bloklarıdır. Pek çok Swift ve SwiftUI API’ında yaygın olarak kullanılır. Closure’ları kod bloğu barındıran bir değişken olarak da düşünmek mümkündür.
- Closure’lar çoğunlukla bir değişkendeki değer değişikliği veya bir eylemin (Bir butona basma, internetten ver indirme) yakalanması için kullanılır. En basit örnekle bir SwiftUI butonu tanımlandığında onunla birlikte yazılan action bölümüdür. Bu bölüm, yazıldığı sırada çalışmaz. Kullanıcı butona bastığı anda çalışır.
- Closure’lar bir değişken gibi paylaşılabilen fonksiyonlardır.
- Closure, bir fonksiyonun içinde bulunduğu ortamın referansı ile birlikte var olan halidir. Başka bir deyişle closure, bir iç fonksiyondan bir dış fonksiyonun kapsamına erişmenizi sağlar.
- Closure, kelimenin tam anlamıyla bir değişkenin içinde saklanan kod bloğudur.
Bende bu farklı tanımları da okumak işe yaradı diyebilirim. Umarım sizde de işe yarar. 🫶 Ayrıca eğer sizin de bu konuyu tam olarak anlamanıza yardımcı olan tanımlar varsa lütfen benimle paylaşın, yazıya eklemek isterim.
Closure & Fonksiyon benzerlik ve farkları nelerdir?
Closure’ları anlamak için belki anlaşılması biraz daha kolay bir konu olan fonksiyonlarla bağ kurmak faydalı olabilir.
Hatırlayalım, fonksiyonlar bir programlama dilinde bir işi yapmak için özelleşmiş kod bloklarıdır. Fonksiyonların bir ismi vardır, parametre alıp geriye bir değer döndürebilirler.
Closure’lar ise ismi olmayan fonksiyonlar olarak karşılaştırılabilir. Closure ve fonksiyonlar aynı işlemleri gerçekleştirmek için kullanılabilir. Aşağıdaki karşılaştırmalı örneği inceleyelim.
- Birinci yapıda
func
anahtar kelimesi ile bir fonksiyon oluşturacağımızı derleyiciye bildiriyor, bu fonksiyona bir isim veriyoruz (Toplama). - Sonrasında parantez içinde kullanacağımız parametrelerin isimlerini ve türlerini belirtiyoruz
(sayi1, Int)
- Son olarak da bu fonksiyon işlemi gerçekleştirdikten sonra bize geri döneceği
return
veri tipini belirliyoruz.-> (Int)
- Daha sonra bu fonksiyonu kullanmak (Call, çağırmak) için parametrelerimizi dolduruyor, bize geri dönülen sonucu bir
someFunction
isimli bir değişkene atıyoruz. - Son olarak da
someFunction
isimli değişkeni yazdırıyoruz. - Fonksiyon Sonucu: 9
- İkinci yapıda
func
kelimesini kullanmadan, normal bir değişken tanımlar gibi kod bloğumuza bu bir isim veriyoruz (toplam). - Sonrasında parantez içinde kullanacağımız parametrelerin türlerini belirtiyoruz (
Int, Int
). - Daha sonra closure işlemi gerçekleştirdikten sonra bize geri döneceği
return
veri tipini belirliyoruz.-> (Int)
- Burada süslü parantez sonrasında parametrelerimize bir isim veriyoruz. (
sayi1
) - Fonksiyonlardan farklı olarak karşımıza çıkan
in
anahtar kelimesi, closure’un gövdesinin başlıyor olduğunu bize işaret ediyor. Yaniin
kelimesinden sonraki alan, kod bloğumuzun işlem yapacağı alan. Öncesi ise isimler ve veri tipleri ile ilgili olan alan. - Bu alanda toplama işlemini gerçekleştiriyor ve sonucu geri döndürüyoruz.
- Daha sonra toplam closure’unu kullanmak için gerekli parametreleri dolduruyor ve işlem sonucunu
sonucClosure
isimli bir değişkene atıyoruz. - Son olarak da
sonucClosure
isimli değişkeni yazdırıyoruz. - Closure Sonucu: 9
Yukarıda fonksiyon ve closure yapılarını kullanarak bir toplama işlemi gerçekleştirdik ve aynı sonucu elde ettik. Böylelikle bu iki yapı arasındaki benzerlik ve farklılıkları görme şansımız oldu.
Closure Çeşitleri Nelerdir:
Yukarıdaki karşılaştırmalı örnekte en temel halini gördüğümüz closure’lar, gerçek hayatta daha farklı şekillerde de karşımıza çıkabiliyor.
Şimdi de bu örnek yazım şekillerine (Syntax) bakalım.
Ben çok uzatmamak için bu konuda bir iki basit örnek verdim. Eğer konuya çok hakim değilseniz benim gibi kafanız karışmasın. 🤓
Ama closure’ların farklı yazım şekilleri ile ilgili ulaştığım şöyle bir kaynak var. Sitenin ismi duygularıma da tercüman oldu resmen. 🤭
Buraya kadar okuduğunuz için tebrik ederim 🥇. İş görüşmesine hazırlanan, closure konusu ile hiç tanışmamış ya da yıldızı barışmamış arkadaşlara faydalı bir yazı oldu diye düşünüyorum.
Türkçe ve anlaşılır kaynak eksikliği olduğunu düşündüğüm konularla ilgili yazmaya devam edeceğim. Eğer bu yazıyı faydalı bulduysanız beğenmek, paylaşmak ya da alkış atmak suretiyle destek vermeniz beni mutlu edecektir, nihayetinde alkışlarla yaşıyoruz 🥳.
Sonuç:
Bu yazıyı okuyunca closure konusunın temellerine hakim olduğunuza inanıyorum. Bolca pratik ile de geliştirme şansımız var.
- Swift programlama dilinde sıklıkla kullanılan bir yapı olan closureları (Kapanış) daha iyi anlayabilmek için farklı tanımlarla ele aldık. ✅
- Karmaşık olan bu konuyu fonksiyonlarla bağlantılayarak bildiğimiz bir yapı ile benzerlik ve farklılıklarını gözlemledik. 🔍
- Farklı closure yazım şekillerine göz attık, temel ve basit olanları örneklendirdik.
Bu yazının devamı niteliğinde olacak 2. yazıda da @escapingClosure
nedir, nasıl ve nerelerde kullanılıyor, örnekler nelerdir gibi biraz daha derine iniyoruz. Mutlaka okumanızı öneririm.
Anlamadığınız, açık olmadığını düşündüğünüz ya da gözden kaçırdığıma inandığınız yerlerle ilgili benimle çekinmeden bağlantı kurabilir, closure’ları daha da iyi anlamama yardım etmek isterseniz de irtibata geçebilirsiz.👇
https://www.linkedin.com/in/eyupmert/
Kaynaklar:
https://www.hackingwithswift.com/read/tr/0/21/closures
https://emregurses.medium.com/swift-fonksiyonlar%C4%B1ndan-closures-9b28c104b1e5
https://www.hackingwithswift.com/sixty/6/12/closures-summary
https://www.reddit.com/r/swift/comments/t9tz4z/best_way_to_understand_closures/