Estou tentando declarar um argumento em Swift que leva um encerramento opcional. A função que declarei tem a seguinte aparência:
class Promise {
func then(onFulfilled: ()->(), onReject: ()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
Mas Swift reclama que "O valor vinculado em uma condicional deve ser um tipo opcional" onde o "if let" é declarado.
swift
optional-parameters
Marcosc
fonte
fonte
Respostas:
Você deve colocar o fechamento opcional entre parênteses. Isso irá definir o escopo adequado do
?
operador.fonte
()->Int?
significa.?
é apenas um açúcar paraOptional<T>
, então você também pode escrever `func then (onFulfilled: () -> (), onReject: Opcional <() -> ()>) {`então você não precisaria do extra()
, embora o IMO()?
seja mais bonito. Além disso, você pode torná-lo ainda mais bonito com um typealias comotypealias RejectHandler = () -> ()
func then(onFulfilled: ()->(), onReject: RejectHandler?) {
Para tornar o código ainda mais curto, podemos usar
nil
como valor padrão para oonReject
parâmetro e encadeamento opcional?()
ao chamá-lo:Desta forma, podemos omitir o
onReject
parâmetro quando chamamos athen
função.Também podemos usar a sintaxe de encerramento final para passar o
onReject
parâmetro para athen
função:Aqui está uma postagem no blog sobre isso.
fonte
Como eu suponho que esse fechamento "opcional" simplesmente não faça nada, você poderia usar um parâmetro com um fechamento vazio como valor padrão:
esta função agora pode ser chamada com ou sem o
onReject
retorno de chamadaNão há necessidade de Swift é incrível
Optionals?
aqui!fonte
Talvez seja uma maneira mais limpa. Principalmente quando o fechamento possui parâmetros complicados.
fonte