Geschichte der Frage: Die Trailing Closure-Syntax ist eine syntaktische Konstruktion in Swift, die zur Verbesserung der Lesbarkeit des Codes bei der Verwendung von geschlossenen Blöcken (closures) am Ende von Funktionen eingeführt wurde. Sie erleichtert die Arbeit mit großen und verschachtelten Closures, insbesondere im funktionalen und deklarativen Stil.
Problem: Die standardmäßige Deklaration von Closures mit vielen Klammern erschwert die visuelle Struktur des Codes und macht ihn weniger verständlich:
UIView.animate(withDuration: 0.3, animations: { ... })
Mit wachsender Größe des Closures wird dieser Code weniger lesbar.
Lösung: Swift erlaubt es, das letzte Argument, das eine Funktion ist, aus den Klammern herauszunehmen:
UIView.animate(withDuration: 0.3) { // Animationsblock }
Wenn es zwei oder mehr Closures gibt, ist die Trailing Closure-Syntax nur für das letzte Closure-Argument möglich, die anderen müssen in runden Klammern angegeben werden.
Wichtige Eigenschaften:
Kann die Trailing Closure-Syntax angewendet werden, wenn das Closure nicht der letzte Parameter der Funktion ist?
Nein, nur der letzte Parameter kann als Trailing Closure formatiert werden. Wenn mehr als ein Closure erforderlich ist, kann nur das letzte nach den Klammern angeführt werden, die anderen werden innerhalb der runden Klammern übergeben.
func fetch(url: String, completion: () -> Void, onError: () -> Void) fetch(url: "...", completion: { ... }) { // onError }
Kann man die runden Klammern bei einem Methodenaufruf mit einem Closure-Argument weglassen?
Ja, wenn die Funktion ein einziges Argument annimmt, das ein Closure ist, können die Klammern vollständig weggelassen werden:
func doWork(action: () -> Void) doWork { print("Aufgabe") }
Kann die Trailing Closure für Funktionen mit variadischen Parametern nach dem Closure verwendet werden?
Nein, die Trailing Closure-Syntax ist nur anwendbar, wenn das Closure das letzte Argument ist. Danach dürfen weder variadische noch andere Parameter folgen. Folgendes würde einen Fehler auslösen:
func test(x: () -> Void, y: Int...) // ... Aufruf ist mit Trailing Closure nicht möglich
Der Aufruf mit zwei Closure-Parametern ist ohne Trailing-Syntax gestaltet, weshalb die Methode 5 Bildschirme vertikal einnimmt, die Verständlichkeit steigt.
Vorteile:
Nachteile:
In der Implementierung von UICollectionViewCompositionalLayout wird eine Trailing Closure verwendet — der Layout-Block ist leicht lesbar, die Struktur zeigt visuell die Hierarchie der Layout-Komponenten.
Vorteile:
Nachteile: