Swift 3: Schließparameterattribute werden jetzt auf den Parameter angewendet Typ , und nicht der Parameter selbst
Vor der Swift 3, wobei die Verschluss - Attribute @autoclosure
und @noescape
verwendete Attribute der Schließung seinen Parameter , jedoch sind Attribute nun den Parametertyp ; Siehe den folgenden akzeptierten Swift-Evolutionsvorschlag:
Ihre spezielle Frage bezieht sich auf das Parametertypattribut @escaping
(für das dieselbe neue Regel gilt), wie im akzeptierten Swift-Evolutionsvorschlag beschrieben, damit Schließparameter standardmäßig nicht maskiert werden:
Diese Vorschläge werden jetzt beide in der Beta-Phase von Xcode 8 implementiert (siehe Versionshinweise für Xcode 8 Beta 6 ; Dev. Konto-Login für den Zugriff erforderlich)
Neu in Xcode 8 Beta 6 - Swift Compiler: Swift Language
Schließparameter werden standardmäßig nicht maskiert, anstatt explizit mit Anmerkungen versehen zu werden @noescape
. Verwenden Sie @escaping
diese Option, um anzuzeigen, dass ein Schließparameter möglicherweise ausgeblendet wird. @autoclosure(escaping)
ist jetzt geschrieben als
@autoclosure @escaping
. Die Anmerkungen @noescape
und
@autoclosure(escaping)
sind veraltet. (SE-0103)
...
Neu in Xcode 8 Beta - Swift- und Apple LLVM-Compiler: Swift Language
Die Attribute @noescape
und @autoclosure
müssen jetzt vor dem Parametertyp und nicht vor dem Parameternamen geschrieben werden. [SE-0049]
Daher verwenden Sie das nicht standardmäßige @escaping
Attribut wie folgt: wird auf den Typ des Abschlussparameters und nicht auf den Parameter selbst angewendet
func doSomething(withParameter parameter: Int, completion: @escaping () -> ()) {
}
(Einschließlich meiner Antwort auf eine Frage in einem positiv bewerteten Kommentar unten, da Kommentare keine dauerhaften Daten zu SO sind.)
@Cristi Băluță: "Was macht Escapeing? Ich habe diese Schlüsselwörter vor der automatischen Konvertierung von swift3 noch nie gesehen ..."
Siehe z. B. den Link zum obigen SE-0103-Evolutionsvorschlag (sowie den zitierten Text aus den Beta 6 -Versionshinweisen ): Zuvor wurden die Schließungsparameter standardmäßig maskiert (daher ist keine explizite Anmerkung zum Escaping erforderlich). sind aber jetzt standardmäßig nicht entkommen. Daher die Hinzufügung von @escaping
explizit zu kommentieren, dass ein Schließungsparameter entkommen kann (im Gegensatz zu seinem Standardverhalten). Dies erklärt auch, warum @noescape
jetzt veraltet ist (das Standardverhalten muss nicht kommentiert werden).
Um zu erklären, was es bedeutet, dass ein Abschlussparameter maskiert wird, zitiere ich die Sprachreferenz - Attribute :
"Wenden Sie dieses Attribut auf den Typ eines Parameters in einer Methoden- oder Funktionsdeklaration an, um anzugeben, dass der Wert des Parameters für die spätere Ausführung gespeichert werden kann. Dies bedeutet, dass der Wert die Lebensdauer des Aufrufs überleben darf."
@escaping
explizit zu kommentieren, dass ein close-Parameter entkommen kann (im Gegensatz zu seinem Standardverhalten). Dies erklärt auch, warum@noescape
nicht veraltet ist (Standardverhalten muss nicht kommentiert werden).@noescape
Ab xcode 8 ist Beta 6
@noescape
die Standardeinstellung. Zuvor@escaping
war die Standardeinstellung. Jeder, der von früheren Versionen auf Swift 3.0 aktualisiert, kann diesen Fehler erhalten.Sie können einen
@noescape
Abschluss nicht in einer Variablen speichern . Wenn Sie einen Abschluss in einer Variablen speichern können, können Sie den Abschluss von einer beliebigen Stelle in Ihrem Code aus ausführen. Gibt jedoch an@noescape
, dass der Schließungsparameter dem Funktionskörper nicht entkommen kann.Dies führt zu einem Compilerfehler in Xcode 8
class MyClass { var myClosure: (() -> ())? func doSomething(finishBlock: () -> ()) { myClosure = finishBlock // ‼️ Error: Assigning non-escaping parameter 'finishBlock' to an @escaping closure } }
Dies wird ok kompilieren (explizit schreiben
@escaping
)class MyClass { var myClosure: (() -> ())? func doSomething(finishBlock: @escaping () -> ()) { myClosure = finishBlock } }
Vorteile von
@noescape
:Weitere Informationen finden Sie unter: Machen Sie nicht entkommende Verschlüsse zur Standardeinstellung
quelle