web-dev-qa-db-fra.com

Passer un rappel optionnel dans la fonction Swift

J'apprends Swift lang, mais je ne peux pas passer d'argument de rappel facultatif dans la fonction:

func dismiss(completion: () -> Void) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}

Cela me montre une erreur - Type () -> Void does not conform to protocol 'LogicValue'

Aucune suggestion?

44
Kosmetika

Mise à jour pour Swift 3/4:

Une option n'est plus une expression booléenne et la func dismissModalViewControllerAnimated(animated: Bool) obsolète n'est plus disponible dans Swift.

Déclarez simplement le paramètre d'achèvement comme une fermeture facultative et transmettez-le à

func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)

qui prend également une fermeture facultative:

func dismiss(completion: (() -> Void)? = nil) {
    self.dismiss(animated: true, completion: completion)
}

Ancien (Swift 1.x?) Réponse:

Déclarez le paramètre completion comme (implicitement déplié) facultatif fermeture (() -> Void)!:

func dismiss(completion: (() -> Void)!) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}

Mais notez que vous pouvez appeler

self.dismissViewControllerAnimated(true, completion: completion)

dans tous les cas, car le paramètre completion de cette fonction est également optionnel. Et

func dismissModalViewControllerAnimated(animated: Bool)

est en fait marqué comme obsolète.

56
Martin R

Ajout juste à la réponse de Martin R ci-dessus ..

Le rappel peut être facultatif, au lieu d'un paramètre implicite (avec point d'exclamation), utilisez l'opérateur facultatif.

func dismiss(completion: (() -> Void)?) {
    if completion != nil {
        return self.dismissViewControllerAnimated(true, completion: completion!)
    }

    self.dismissModalViewControllerAnimated(true)
}
16
code ninja

Il est préférable d'ajouter = nil Dans la déclaration de rappel, pour éviter de passer à zéro lors de l'appel:

func dismiss(completion: (() -> Void)? = nil) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true) }

Et vous pouvez appeler votre fonction comme ceci: dismiss()

11
Rémy Virin