web-dev-qa-db-fra.com

Comment fait-on une fermeture optionnelle en quick?

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é.

87
Marcosc

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! 
    }
 }
101
Cezar

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.

53
Evgenii

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!

32
DiegoFrings

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! 
    }
}

}
3
Seifolahi