Swift 3: fermeture attributs de paramètres sont maintenant appliquées pour le paramètre de type, et pas le paramètre lui-même
Avant Swift 3, de la fermeture des attributs @autoclosure
et @noescape
utilisé pour être des attributs de la fermeture de paramètre, mais sont maintenant des attributs pour le paramètre type; voir la suite accepté Swift évolution de la proposition:
Votre question concernent le type de paramètre d'attribut @escaping
(pour lesquels la même la nouvelle règle s'applique), comme décrit dans la accepté Swift évolution de la proposition de laisser la fermeture des paramètres non échapper par défaut:
Ces propositions sont actuellement mis en œuvre dans la phase bêta de Xcode 8 (voir les notes de version de Xcode beta 8 6; dev. compte de connexion nécessaires à l'accès)
Nouveau dans Xcode beta 8 6 - Swift Compilateur: Swift Langue
Fermeture paramètres sont non-fuyant par défaut, plutôt que d'être explicitement
être annotée avec l' @noescape
. Utiliser @escaping
à indiquer qu'un
fermeture paramètre peut s'échapper. @autoclosure(escaping)
est maintenant écrite comme
@autoclosure @escaping
. Les annotations @noescape
et
@autoclosure(escaping)
sont obsolètes. (SE-0103)
...
Nouveau dans Xcode beta 8 – Swift et Apple LLVM Compilateurs: Swift Langue
L' @noescape
et @autoclosure
attributs doivent maintenant être écrite
avant le type de paramètre à la place de avant le nom du paramètre. [SE-0049]
Par conséquent, vous utilisez la non-valeur par défaut @escaping
attribut comme suit; appliqué au type de la fermeture de paramètre, plutôt que le paramètre lui-même
func doSomething(withParameter parameter: Int, completion: @escaping () -> ()) {
// ...
}
(Y compris ma réponse à une question dans un upvoted commentaire ci-dessous, que les commentaires ne sont pas de données persistantes sur)
@Cristi Băluță: "Ce qui fait échapper? Jamais vu ce mots-clés
avant swift3 auto-conversion ... "
Voir, par exemple, le lien vers le SE-0103 de l'évolution de la proposition ci-dessus (ainsi que le texte cité de la beta 6 notes de version): auparavant, la fermeture des paramètres échapper par défaut (et donc aucun besoin de l'existence d'une volonté explicite d'annotation pour l'échappement), mais maintenant plutôt le non échapper, par défaut. D'où l'ajout d' @escaping
d'annoter explicitement qu'une fermeture paramètre peut échapper (contrairement à son comportement par défaut). Cela explique aussi pourquoi, @noescape
est maintenant obsolète (pas besoin d'annoter le comportement par défaut).
Pour expliquer ce qu'il signifie qu'une fermeture paramètre est de fuir, je cite la Langue de Référence - les attributs:
"Appliquer cet attribut à un paramètre de type dans une méthode ou une déclaration de fonction pour indiquer que la valeur du paramètre peut être stockée pour
plus tard l'exécution. Cela signifie que la valeur est autorisé à survivre à l'
durée de l'appel."