NEW: Join my free 100 Days of SwiftUI challenge today! >>

Closures

Şimdiye kadar tam sayılarla, string'lerle, kesirli ve ondalıklı sayılarla, Boolean'larla, dizilerle, sözlüklerle, struct'larla ve class'larla karşılaştınız. Ama Swift dilinde geniş bir şekilde kullanılan bir veri tipi daha var ve closure olarak anılıyor. Bunlar karmaşıktır, ama aynı zamanda güçlü ve anlamlıdırlar öyle ki, Cocoa Touch içinde her tarafta yaygın bir şekilde kullanılırlar. O yüzden, onları anlamadan daha fazla ileriye gidemezsiniz.

Bir closure, kod içeren bir değişken olarak düşünülebilir. Yani 0 veya 500 tam sayısının tutulduğu yerde, bir closure Swift kodu satırları tutabilir. Bir fonksiyona göre farklıdır yine de, çünkü closure'lar kendi haklarına sahip veri tipleridirler: Bir closure'u parametre olarak geçebilir veya bir özellik olarak saklayabilirsiniz. Closure'lar aynı zamanda oluşturuldukları ortamı da yakalarlar. Bu, içlerinde kullanılan değerlerin bir kopyasını aldıkları anlamına gelir.

Kendi closure'unuzu tasarlamanız asla gerekmez, o yüzden takip etmesini oldukça zor bulsanız da çekinmeyiniz. Zaten, hem Cocoa hem de Cocoa Touch ihtiyaçlarını karşılamak için sizden sık sık closure'lar yazmanızı isteyecek. O yüzden en azından nasıl çalıştıklarını bilmeniz gerekli. Şimdi ilk olarak bir Cocoa Touch örneği ele alalım:

let vw = UIView()

UIView.animate(withDuration: 0.5, animations: {
    vw.alpha = 0
})

UIView, kullanıcı arayüzü taşıyıcısının en temel türünü sunan UIKit içindeki bir iOS veri tipidir. Ne işe yaradığıyla şimdilik ilgilenmeyin, bütün olay temel kullanıcı arayüzü bileşeni olması. UIView, animate() adlı bir metoda sahip ve bununla animasyon kullanarak arayüzünüzü değiştirebilirsiniz; neyin değişeceğini ve ne kadar süreceğini siz tanımlarsınız, geri kalanını da Coca Touch halleder.

Bu kod içinde animate() metodu iki parametre alıyor: Animasyonun biteceği saniye ve animasyon parçası olarak çalıştırılacak olan kodu içeren bir closure. İlk parametreyi yarım saniye olarak tanımladım ve ikincisi ile de UIKit'in view'ün "tamamen saydam" anlamına gelen alfa 0'a (bu saydamlıktır) ayarlamasını istedim.

Bu metod bir closure kullanmayı gerektiriyor, çünkü UIKit başlayacak animasyon için hazırlanacak her tür işi yapmak zorunda. Böylece olan şey, UIKit süslü parantez içindeki (işte bu bizim closure'muz) kodun kopyasını alıyor, bir yerde depoluyor, tüm hazırlıkları yapıyor, ardından da hazır olduğunda kodumuzu çalıştırıyor. Eğer kodumuzu doğrudan çalıştırsaydık, bu mümkün olmazdı.

Yukarıdaki kod aynı zamanda closure'ların ortamlarını nasıl yakaladıklarını da gösteriyor: vw adında closure'un dışında bir sabit tanımladım, sonra onu içerisinde kullandım. Swift bunu tespit etti ve verinin closure'un içinde de kullanılabilir olmasını sağladı.

Swift'in, bir closure'un ortamı otomatik olarak yakalama sistemi çok yardımcıdır, ama nadiren de olsa sizi şaşırtır: Eğer bir A nesnesi özellik olarak bir closure tutuyorsa, bu özellik aynı zamanda A nesnesine gönderir. Bu da güçlü referans döngüsü adında bir şeye sahip olmanız demektir ki, kullanıcıları mutsuz edersiniz. Bu, şu anda bilmeniz gerekenden büyük ölçüde daha gelişmiş bir konudur. O yüzden şimdilik üzerinde fazla durmayın.

Trailing closures (Takip eden closure'lar)

Closure'lar çok sık bir şekilde kullanıldığı için, Swift kodunuzu daha kolay okunabilir hale getirmek için sözdizimsel bir güzellik uygulayabilir. Kural şöyle: Bir metodun son parametresi bir closure alıyorsa, bu parametreyi silebilir ve yerine süslü parantezler içindeki kodu sağlayabilirsin. Örneğin daha önceki kodu şu şekilde dönüştürebiliriz:

let vw = UIView()

UIView.animate(withDuration: 0.5) {
    vw.alpha = 0
}

Bu, kodunuzu daha kısa ve okuması daha kolay hale getirir. O yüzden sözdizimsel şekli –takip eden closure sözdizimi olarak bilinir– tercih edilir.

SPONSORED Instabug helps you identify and resolve severe crashes quickly. You can retrace in-app events and know exactly which line of code caused the crash along with environment details, network logs, repro steps, and the session profiler. Ask more questions or keep users up-to-date with in-app replies straight from your dashboard. Instabug takes data privacy seriously, so no one sees your data but you! See more detailed features comparison and try Instabug's crash reporting SDK for free.

BUY OUR BOOKS
Buy Pro Swift Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift (Vapor Edition) Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Server-Side Swift (Kitura Edition) Buy Beyond Code

Was this page useful? Let us know!