Hier ist eine sehr einfache rekursive Funktion:
%Vor%Wenn ich es als Schließung konvertieren möchte:
%Vor%Ich habe einen Compiler-Fehler: "Variable innerhalb ihres eigenen Anfangswertes verwendet"
Sie können es umgehen mit zwei Schritt Zuweisung
%Vor%oder Sie können Y Kombinator
%Vor% Dies ist eine Umgehung des Speicherleckproblems, das @zneak gefunden hat (Es ist kein Speicherleck vorhanden, aber der falsche Wert wurde erfasst)
BEARBEITEN Dies wurde mit Swift 2 unter Verwendung lokaler Funktionen behoben. Apple schlägt diesen Code vor:
%Vor%Obwohl dies aus dem aktuellen Beispiel nicht offensichtlich ist, erfassen sogenannte lokale Funktionen die Locals des umschließenden Bereichs.
Die Verwendung einer Ortungsfunktion führt nicht zu einem Leck, während eine Schließung dies tun würde. Allerdings kann lap
in diesem Fall nicht neu zugewiesen werden.
Ich habe eine E-Mail von Apples Joe Groff erhalten, in der es heißt, dass es weiterhin geplant sei, Schließungen als schwache und veränderbare Variablen bei einem zu erfassen späterer Punkt. Dies bestätigt jedoch, dass es momentan keine Möglichkeit gibt, dies zu tun, außer mit einer lokalen Funktion.
Ihre aktuelle Lösung enthält ein Speicherleck: Die Schließung von lap
hat einen starken Verweis auf sich selbst, was bedeutet, dass sie niemals freigegeben werden kann. Dies kann leicht überprüft werden, indem das folgende Programm mit dem beigefügten Leaks-Instrument gestartet wird:
Leider, wie die explizite Capture-Syntax kann nicht auf Closure-Typen angewendet werden (Sie erhalten einen Fehler, der besagt, dass '' unowned 'nicht auf Nicht-Klassen-Typ' (Int) - & gt; Int '" angewendet werden kann) scheint kein einfacher Weg zu sein, dies zu erreichen, ohne zu lecken. Ich habe einen Fehlerbericht darüber eingereicht.
Was ist damit?
%Vor%Es ist ziemlich einfach, ich habe gerade eine rekursive lokale Funktion innerhalb einer Schließung definiert, die die Funktion zurückgibt.
Allerdings muss ich sagen, dass die Antwort von @Bryan Chen über den Y-Kombinator großartig ist.
Ich hatte das gleiche Problem und war nicht mit irgendetwas, das da draußen war, zufrieden. Also habe ich eine Bibliothek erstellt und sie auf GitHub .
Mit dieser Bibliothek (mit Swift 3.0) würde Ihr Code wie folgt aussehen:
%Vor%Tags und Links swift