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
nilcomo valor predeterminado para elonRejectparámetro y el encadenamiento opcional?()al llamarlo:De esta forma podemos omitir el
onRejectparámetro cuando llamamos a lathenfunción.También podemos usar la sintaxis de cierre final para pasar el
onRejectparámetro a lathenfunció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
onRejectdevolució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