Gegeben:
typealias Action = () -> ()
var action: Action = { }
func doStuff(stuff: String, completion: @escaping Action) {
print(stuff)
action = completion
completion()
}
func doStuffAgain() {
print("again")
action()
}
doStuff(stuff: "do stuff") {
print("swift 3!")
}
doStuffAgain()
Gibt es eine Möglichkeit, den completion
Parameter (und action
) vom Typ zu machen Action?
und auch zu behalten @escaping
?
Das Ändern des Typs führt zu folgendem Fehler:
Das Attribut @escaping gilt nur für Funktionstypen
Wenn Sie das @escaping
Attribut entfernen , wird der Code kompiliert und ausgeführt, scheint jedoch nicht korrekt zu sein, da der completion
Abschluss dem Funktionsumfang entgeht.
@escaping
Attributs, Kompilieren und Ausführen des Codes" - Dies liegt daran, dass, wie in SR-2444 beschrieben ,Action?
standardmäßig ein Escapezeichen angezeigt wird. So, das Entfernen ,@escaping
wenn der optionalen Verschluss mit vollbringt , was Sie brauchen.Antworten:
Es gibt einen SR-2552- Bericht, der
@escaping
keinen Funktionstyp-Alias erkennt. deshalb der fehler@escaping attribute only applies to function types
. Sie können das Problem umgehen, indem Sie den Funktionstyp in der Funktionssignatur erweitern:EDIT 1: :
Ich war tatsächlich unter einer Beta-Version von xcode 8, in der der Fehler SR-2552 noch nicht behoben wurde. Um diesen Fehler zu beheben, wurde ein neuer Fehler eingeführt (der, mit dem Sie konfrontiert sind), der noch offen ist. siehe SR-2444 .
Die Problemumgehung, die @Michael Ilseman als vorübergehende Lösung bezeichnet hat, besteht darin, das
@escaping
Attribut aus dem optionalen Funktionstyp zu entfernen, wodurch die Funktion als maskiert bleibt .EDIT 2: :
Der SR-2444 wurde geschlossen und weist ausdrücklich darauf hin, dass Schließungen in Parameterpositionen nicht ausgeblendet werden und mit gekennzeichnet werden müssen
@escaping
, damit sie ausgeblendet werden. Die optionalen Parameter werden jedoch implizit ausgeblendet, da dies((Int)->())?
ein Synonym fürOptional<(Int)->()>
optionale Verschlüsse ist.quelle
@escaping may only be applied to parameters of function type func doStuff(stuff: String, completion: (@escaping ()->())?) {
a temporary solution is remove the @escaping attribute from optional function type, that keep the function as escaping.
Können Sie das weiter erklären? Die Standardsemantik in Swift 3 ist nicht entkommen. Obwohl es ohne @escaping kompiliert wird, befürchte ich, dass es Probleme verursachen wird, wenn es als nicht entkommen behandelt wird. Ist das nicht wahr?@autoclosure
? Man bekommt dort den gleichen Fehler ...von: Mailingliste für schnelle Benutzer
Der optionale Funktionsparameter ist also standardmäßig @escaping.
@noeascape gilt standardmäßig nur für Funktionsparameter.
quelle
(()->Void)?
das gleiche ist wie das Sprichwort, das Sie haben,Optional<()->Void>
und um dasOptional
Eigentum aufrechtzuerhalten, müssten nur@escaping
Funktionen akzeptiert werden. Ich werde drittens sagen, dass dies die akzeptierte Antwort sein sollte. Danke dir.Ich bin auf ein ähnliches Problem
@escaping
gestoßen, weil das Mischen und Nicht- Mischen@escaping
sehr verwirrend ist, besonders wenn Sie die Verschlüsse herumreichen müssen.Am Ende habe ich dem Closure-Parameter über einen No-Op-Standardwert zugewiesen
= { _ in }
, was meiner Meinung nach sinnvoller ist:quelle
Ich habe es in Swift 3 ohne Warnungen nur so zum Laufen gebracht:
quelle
Das Wichtigste, was Sie im Beispiel verstehen sollten, ist, dass beim Wechsel
Action
zumAction?
Verschluss ein Escapezeichen entsteht. Machen wir also, was Sie vorschlagen:Okay, jetzt rufen wir an
doStuff
:Nun, diese Anforderung entsteht nur, um Verschlüssen zu entkommen. Die Schließung entkommt also. Deshalb markiert man es nicht als entkommend - es entkommt bereits.
quelle