Historia pytania: Składnia trailing closure to konstrukcja syntaktyczna Swift, wprowadzona w celu zwiększenia czytelności kodu przy używaniu zamknięć na końcu bloków funkcji. Ułatwia pracę z dużymi i zagnieżdżonymi zamknięciami, szczególnie w stylu funkcyjnym i deklaratywnym.
Problem: Standardowe deklarowanie zamknięć z wieloma nawiasami komplikuje wizualną strukturę kodu, czyniąc go mniej zrozumiałym:
UIView.animate(withDuration: 0.3, animations: { ... })
Wraz ze zwiększaniem się rozmiaru closure kod staje się mniej czytelny.
Rozwiązanie: Swift umożliwia umieszczanie ostatniego argumentu-funkcji poza nawiasami:
UIView.animate(withDuration: 0.3) { // blok animacji }
Jeśli zamknięć jest dwa lub więcej, składnia trailing closure jest możliwa tylko dla ostatniego parametru closure, pozostałe muszą być podawane w nawiasach okrągłych.
Kluczowe cechy:
Czy można stosować składnię trailing closure, jeśli closure nie jest ostatnim parametrem funkcji?
Nie, tylko ostatni parametr może być sformatowany jako trailing closure. Jeśli wymaga się więcej niż jednego closure, tylko ostatni może być umieszczony po nawiasach, pozostałe są przekazywane wewnątrz nawiasów okrągłych.
func fetch(url: String, completion: () -> Void, onError: () -> Void) fetch(url: "...", completion: { ... }) { // onError }
Czy można pominąć nawiasy przy wywołaniu metody z jednym argumentem-closure?
Tak, jeśli funkcja przyjmuje jeden argument, który jest closure, nawiasy można całkowicie pominąć:
func doWork(action: () -> Void) doWork { print("Zadanie") }
Czy można używać trailing closure dla funkcji z parametrami wariadycznymi po closure?
Nie, składnia trailing closure jest stosowana tylko, jeśli closure jest ostatnim argumentem. Po nim nie mogą być żadne parametry wariadyczne ani inne. Następujące wywołanie spowoduje błąd:
func test(x: () -> Void, y: Int...) // ... wywołanie niemożliwe z trailing closure
Wywołanie z dwoma parametrami closure zostało wykonane bez składni trailing, przez co metoda zajmuje 5 ekranów w pionie, a trudność w zrozumieniu rośnie.
Zalety:
Wady:
W implementacji UICollectionViewCompositionalLayout używa się trailing closure — blok layoutu jest łatwy do przeczytania, a struktura wizualnie odzwierciedla hierarchię komponentów layoutu.
Zalety:
Wady: