closure callbacks swift optional-parameters

swift - callbacks - ¿Cómo se puede hacer un cierre opcional en poco tiempo?



var return swift (4)

Como supongo que este cierre "opcional" simplemente no debería hacer nada, podría usar un parámetro con un cierre vacío como valor predeterminado:

func then(onFulfilled: ()->(), onReject: ()->() = {}){ // now you can call your closures onFulfilled() onReject() }

esta función ahora se puede llamar con o sin la devolución de llamada onReject

then({ ... }) then({ ... }, onReject: { ... })

No es necesario tener increíbles opciones Optionals? Swift Optionals? ¡aquí!

Intento declarar un argumento en Swift que tenga un cierre opcional. La función que he declarado se ve así:

class Promise { func then(onFulfilled: ()->(), onReject: ()->()?){ if let callableRjector = onReject { // do stuff! } } }

Pero Swift se queja de que "el valor encuadernado en un condicional debe ser un tipo opcional" donde se declara el "si está permitido".


Debe incluir el cierre opcional entre paréntesis. Esto abarcará correctamente el ? operador.

func then(onFulfilled: ()->(), onReject: (()->())?){ if let callableRjector = onReject { // do stuff! } }


Para hacer que el código sea aún más corto, podemos usar nil como valor predeterminado para el parámetro onReject y el encadenamiento opcional ?() Cuando lo onReject :

func then(onFulfilled: ()->(), onReject: (()->())? = nil) { onReject?() }

De esta forma podemos omitir el parámetro onReject cuando llamemos a la función.

then({ /* on fulfilled */ })

También podemos usar la sintaxis de cierre final para pasar el parámetro onReject a la función:

then({ /* on fulfilled */ }) { // ... on reject }

Aquí hay una publicación en el blog sobre esto.


Tal vez es una manera más limpia. Especialmente cuando el cierre tiene parámetros complicados.

typealias SimpleCallBack = () -> () class Promise { func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){ if let callableRjector = onReject { // do stuff! } } }