Dado:
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()
¿Hay alguna forma de hacer el completionparámetro (y action) de tipo Action?y también mantener @escaping?
Cambiar el tipo da el siguiente error:
El atributo @escaping solo se aplica a los tipos de función
Al eliminar el @escapingatributo, el código se compila y se ejecuta, pero no parece ser correcto ya que el completioncierre está escapando del alcance de la función.

@escapingatributo, el código se compila y se ejecuta". Eso se debe a que, como se describe en SR-2444 , seAction?está escapando de forma predeterminada. Por lo tanto, la eliminación@escapingal usar el cierre opcional logra lo que necesita.Respuestas:
Hay un informe SR-2552 que
@escapingno reconoce el alias de tipo de función. Por eso el error@escaping attribute only applies to function types. puede solucionarlo expandiendo el tipo de función en la firma de la función:EDITAR 1 ::
En realidad, estaba bajo una versión beta de xcode 8 donde el error SR-2552 aún no se había resuelto. arreglando ese error, introduje uno nuevo (el que estás enfrentando) que todavía está abierto. ver SR-2444 .
La solución alternativa @Michael Ilseman señaló que una solución temporal es eliminar el
@escapingatributo del tipo de función opcional, que mantiene la función como escape .EDITAR 2 ::
El SR-2444 se ha cerrado indicando explícitamente que los cierres en los parámetros posiciones no están escapando y ellos tienen que ser marcados con
@escapinghacerlos escapar, pero los parámetros opcionales están escapando de forma implícita, ya que((Int)->())?es una de sinónimosOptional<(Int)->()>, cierres opcionales están escapando.fuente
@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.¿Puedes explicarlo mas a fondo? La semántica predeterminada en swift 3 no se escapa. Aunque se compila sin @escaping, me temo que causará problemas al ser tratado como no escapado. ¿No es eso cierto?@autoclosure? Uno obtiene el mismo error allí ...de: lista de correo de usuarios rápidos
Entonces, el parámetro de función opcional es @escaping por defecto.
@noeascape solo se aplica al parámetro de función de forma predeterminada.
fuente
(()->Void)?es lo mismo que decir que tienesOptional<()->Void>yOptionalpara mantener la propiedad solo tendría que aceptar@escapingfunciones. Tercero, esta debería ser la respuesta aceptada. Gracias.Me encontré con un problema similar porque mezclar
@escapingy no@escapinges muy confuso, especialmente si necesita pasar los cierres.Terminé asignando un valor predeterminado sin operación al parámetro de cierre a través de
= { _ in }, lo que creo que tiene más sentido:fuente
Lo hice funcionar en Swift 3 sin ninguna advertencia solo de esta manera:
fuente
Lo importante que debes entender en el ejemplo es que si cambias
ActionalAction?cierre se escapa. Entonces, hagamos lo que propongas:Bien, ahora llamaremos
doStuff:Bueno, ese requisito solo surge para escapar de los cierres. Entonces el cierre se está escapando. Es por eso que no lo marca como un escape, ya está escapando.
fuente