Sorunun Tarihi: Trailing closure sözdizimi, fonksiyonların sonunda bloklar (closures) kullanırken kodun okunabilirliğini artırmak için tanıtılmış bir Swift sözdizimidir. Özellikle fonksiyonel ve deklaratif stilde, büyük ve iç içe closure'larla çalışmayı kolaylaştırır.
Sorun: Birden fazla parantezle standart closure tanımlaması, kodun görsel yapısını karmaşık hale getirir, anlaşılmasını zorlaştırır:
UIView.animate(withDuration: 0.3, animations: { ... })
Closure'ın büyüklüğü arttıkça, bu kod okunabilirliğini kaybeder.
Çözüm: Swift, son argüman fonksiyonunun parantezlerin dışına çıkarılmasına izin verir:
UIView.animate(withDuration: 0.3) { // animasyon bloğu }
Eğer iki veya daha fazla closure varsa, trailing closure sözdizimi yalnızca son closure parametresi için mümkündür, geri kalanlar yuvarlak parantez içinde belirtilmelidir.
Ana özellikler:
Closure son parametre değilse trailing closure sözdizimi kullanılabilir mi?
Hayır, yalnızca son parametre trailing closure olarak biçimlendirilebilir. Birden fazla closure gerekiyorsa, yalnızca sonuncusu parantezlerin dışına çıkarılabilir, diğerleri yuvarlak parantez içinde geçer.
func fetch(url: String, completion: () -> Void, onError: () -> Void) fetch(url: "...", completion: { ... }) { // onError }
Tek bir closure argümanı ile bir metodun çağrısında parantezler atlanabilir mi?
Evet, fonksiyon tek bir closure argümanı alıyorsa, parantezler tamamen atlanabilir:
func doWork(action: () -> Void) doWork { print("Görev") }
Closure'dan sonra değişken sayıda parametreli fonksiyonlar için trailing closure kullanılabilir mi?
Hayır, trailing closure sözdizimi yalnızca closure son argüman olduğunda uygulandığı için, onun ardından değişken sayıda veya başka parametre olamaz. Aşağıdaki çağrı bir hata verecektir:
func test(x: () -> Void, y: Int...) // ... trailing closure ile çağrı mümkün değildir
İki closure parametresi olmadan trailing sözdizimi olmadan çağrı yapılması, metoda 5 ekranlık bir alan kapladığı için anlaşılabilirliği zorlaştırır.
Artılar:
Eksiler:
UICollectionViewCompositionalLayout uygulamasında trailing closure kullanımı — layout bloğu kolayca okunur, yapı görsel olarak layout bileşenlerinin hiyerarşisini yansıtır.
Artılar:
Eksiler: