NEW: Learn SwiftUI with my free YouTube video series! >>

< Previous: Çokbiçimlilik ve tipleme   Next: Sonuç >

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.

LEARN SWIFTUI FOR FREE I wrote a massive, free SwiftUI tutorial collection, and also have a growing list of free SwiftUI tutorials on YouTube – get started today!

< Previous: Çokbiçimlilik ve tipleme   Next: Sonuç >
MASTER SWIFT NOW
Buy Testing Swift Buy Practical iOS 12 Buy Pro Swift Buy Swift Design Patterns Buy Swift Coding Challenges Buy Server-Side Swift (Vapor Edition) Buy Server-Side Swift (Kitura Edition) Buy Hacking with macOS Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with Swift Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let me know!

Click here to visit the Hacking with Swift store >>