Storia della domanda: La sintassi trailing closure è una costruzione sintattica di Swift introdotta per migliorare la leggibilità del codice quando si utilizzano blocchi di chiusura alla fine delle funzioni. Facilita il lavoro con chiusure grandi e annidate, soprattutto in stili funzionali e dichiarativi.
Problema: La dichiarazione standard delle chiusure con molte parentesi complica la struttura visiva del codice, rendendolo meno comprensibile:
UIView.animate(withDuration: 0.3, animations: { ... })
Con l'aumentare delle dimensioni della closure, questo codice diventa meno leggibile.
Soluzione: Swift consente di estrarre l'ultimo argomento-funzione al di fuori delle parentesi:
UIView.animate(withDuration: 0.3) { // blocco di animazione }
Se ci sono due o più chiusure, la sintassi trailing closure è possibile solo per l'ultimo parametro closure, mentre gli altri devono essere specificati tra parentesi tonde.
Caratteristiche principali:
È possibile applicare la sintassi trailing closure se la closure non è l'ultimo parametro della funzione?
No, solo l'ultimo parametro può essere formulato come trailing closure. Se sono necessarie più chiusure, solo l'ultima può essere estratta dopo le parentesi, mentre le altre vengono trasmesse all'interno delle parentesi tonde.
func fetch(url: String, completion: () -> Void, onError: () -> Void) fetch(url: "...", completion: { ... }) { // onError }
È possibile omettere le parentesi tonde quando si chiama un metodo con un unico argomento-closure?
Sì, se la funzione accetta un argomento unico che è una closure, le parentesi possono essere completamente omesse:
func doWork(action: () -> Void) doWork { print("Compito") }
È possibile utilizzare la trailing closure per funzioni con parametri variadic dopo la closure?
No, la sintassi trailing closure si applica solo se la closure è l'ultimo argomento. Dopo di essa non possono esserci parametri variadic né altri. La seguente chiamata restituirà un errore:
func test(x: () -> Void, y: Int...) // ... chiamata non possibile con trailing closure
Chiamata con due parametri closure senza sintassi trailing, il che porta il metodo a occupare 5 schermi in verticale, aumentando la difficoltà di comprensione.
Pro:
Contro:
Nell'implementazione di UICollectionViewCompositionalLayout si utilizza la trailing closure: il blocco layout è facilmente leggibile, la struttura visualizza chiaramente la gerarchia dei componenti layout.
Pro:
Contro: