J'essaie de déclarer un argument dans Swift qui prend une fermeture optionnelle. La fonction que j'ai déclarée ressemble à ceci:
class Promise {
func then(onFulfilled: ()->(), onReject: ()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
Mais Swift se plaint de ce que "la valeur liée dans une conditionnelle doit être un type facultatif" où le "si" est déclaré.
Vous devriez mettre la fermeture facultative entre parenthèses. Cela portera correctement le ?
opérateur.
func then(onFulfilled: ()->(), onReject: (()->())?){
if let callableRjector = onReject {
// do stuff!
}
}
Pour raccourcir le code, nous pouvons utiliser nil
comme valeur par défaut pour le paramètre onReject
et l'enchaînement optionnel ?()
lorsque vous l'appelez:
func then(onFulfilled: ()->(), onReject: (()->())? = nil) {
onReject?()
}
De cette façon, nous pouvons omettre le paramètre onReject
lorsque nous appelons la fonction then
.
then({ /* on fulfilled */ })
Nous pouvons également utiliser la syntaxe de fermeture finale pour passer le paramètre onReject
dans la fonction then
:
then({ /* on fulfilled */ }) {
// ... on reject
}
Voici un blog post à ce sujet.
Puisque je suppose que cette fermeture "optionnelle" ne doit tout simplement rien faire, vous pouvez utiliser un paramètre avec une fermeture vide comme valeur par défaut:
func then(onFulfilled: ()->(), onReject: ()->() = {}){
// now you can call your closures
onFulfilled()
onReject()
}
cette fonction peut maintenant être appelée avec ou sans le callback onReject
then({ ... })
then({ ... }, onReject: { ... })
Pas besoin de l'impressionnant Swift Optionals?
ici!
Peut-être que c'est une façon plus propre. Spécialement lorsque la fermeture a des paramètres compliqués.
typealias SimpleCallBack = () -> ()
class Promise {
func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){
if let callableRjector = onReject {
// do stuff!
}
}
}