Estoy tratando de declarar un argumento en Swift que tiene 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 enlazado en un condicional debe ser un tipo opcional" donde se declara el "if let".
swift
optional-parameters
Marcosc
fuente
fuente
Respuestas:
Debe incluir el cierre opcional entre paréntesis. Esto analizará adecuadamente al
?
operador.fuente
()->Int?
significa.?
que en realidad es solo azúcarOptional<T>
, por lo que también podría escribir `func then (onFuldered: () -> (), onReject: Optional <() -> ()>) {`entonces no necesitarías el extra()
, aunque IMO()?
es más bonito. También puedes hacerlo aún más bonito con un tipo de letra comotypealias RejectHandler = () -> ()
func then(onFulfilled: ()->(), onReject: RejectHandler?) {
Para hacer el código aún más corto, podemos usar
nil
como valor predeterminado para elonReject
parámetro y el encadenamiento opcional?()
al llamarlo:De esta forma podemos omitir el
onReject
parámetro cuando llamamos a lathen
función.También podemos usar la sintaxis de cierre final para pasar el
onReject
parámetro a lathen
función:Aquí hay una publicación de blog al respecto.
fuente
Dado que 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:
esta función ahora se puede llamar con o sin la
onReject
devolución de llamada¡No es necesario que Swift sea increíble
Optionals?
aquí!fuente
Quizás sea una forma más limpia. Especialmente cuando el cierre tiene parámetros complicados.
fuente