UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

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.

TAKE YOUR SKILLS TO THE NEXT LEVEL If you like Hacking with Swift, you'll love Hacking with Swift+ – it's my premium service where you can learn advanced Swift and SwiftUI, functional programming, algorithms, and more. Plus it comes with stacks of benefits, including monthly live streams, downloadable projects, a 20% discount on all books, and free gifts!

Find out more

Sponsor Hacking with Swift and reach the world's largest Swift community!

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI 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 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 Beyond Code

Was this page useful? Let us know!

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.