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 completion
pará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 @escaping
atributo, el código se compila y se ejecuta, pero no parece ser correcto ya que el completion
cierre está escapando del alcance de la función.
@escaping
atributo, 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@escaping
al usar el cierre opcional logra lo que necesita.Respuestas:
Hay un informe SR-2552 que
@escaping
no 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
@escaping
atributo 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
@escaping
hacerlos 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>
yOptional
para mantener la propiedad solo tendría que aceptar@escaping
funciones. Tercero, esta debería ser la respuesta aceptada. Gracias.Me encontré con un problema similar porque mezclar
@escaping
y no@escaping
es 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
Action
alAction?
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