Bedeutet es, dass es als Noescape-Abschluss gilt?
Nein, sicher nicht. Es entkommt der Lebensdauer der Funktion, an die es übergeben wird (init(c:)
in diesem Fall) - also per Definition, es entkommt. Sie haben es einfach nicht, wie @escaping
weil nur Verschlussfunktion Argumente (das heißt Funktionsargumente, die eingegeben werden, als Funktionen selbst) zu markieren sind nicht entkommen standardmäßig (nach SE-0103).
Deshalb, weil der Verschluss entweicht, wird es jeden Staat braucht, dass es fängt Heap zugewiesen zu werden. Es gibt keine Möglichkeit, dass dieser Status stack-allokiert werden kann, da seine Lebensdauer nicht auf den aktuellen Stack-Frame beschränkt ist.
aber in Ihrem Fall, Sie vorbei nur in einer einfachen globalen Funktion, test
. Hier muss keine zusätzliche Heap-Zuweisung erfolgen, da globale Funktionen statisch gespeichert werden und somit nur ein einfacher Zeiger übergeben werden muss.
Obwohl es ist erwähnenswert, dass, weil, dass Sie mit Generika arbeiten, um eine Funktion als eine gegebene allgemeine Platzhalter eingeben T
wird Swift ein reabstraction Thunk verwenden, um die Aufrufkonvention zu vereinen. Dazu wird eine Heap-allokierte Box verwendet, um den Funktionswert zu speichern (genauer gehe ich dazu in this Q&A).
In einem optimierten Build jedoch appears the thunk is able to be specialised in einigen Fällen (z. B. bei direkter Verwendung einer Top-Level-Funktion), daher keine zusätzliche Heap-Allokation erforderlich.
Schließung nicht unbedingt bedeutet asynchrone –
@LeoDabus, was Sie damit meinen Sie? –
Ich glaube nicht, dass Generika irgendwelche Unterschiede machen, zu der Definition von fliehenden und nicht fliehenden Verschlüssen. In Ihrem Beispiel gibt es, soweit ich sehen kann, keine Flucht. – Dasem