web-dev-qa-db-fra.com

Fonction avec bloc de complétion facultatif dans Swift

Lorsque je crée une fonction, je peux rendre un paramètre facultatif en lui donnant une valeur par défaut, comme ceci:

func foo(bar: String = "foobar") {}

Je veux faire la même chose (le rendre facultatif) avec un bloc d'achèvement. J'ai essayé ce qui suit:

func foo(completionBlock: (foo: String) -> () = () -> ())
func foo(completionBlock: (foo: String) -> () = (foo: String) -> ())
func foo(completionBlock: (foo: String) -> () = ((foo: String) -> ()))
func foo(completionBlock: (foo: String) -> () = ((foo: String) in))
func foo(completionBlock: (foo: String) -> () = {(foo: String) in})

Comment puis-je faire ceci?

MODIFIER:
Ceci est/était une question en double, désolé pour cela. Cependant, je n'ai pas trouvé la solution dans la question d'origine. La réponse de Nathan est donc la meilleure

31
ntoonio

Dans Swift 3:

func foo(completionBlock: (String) -> () = { _ in }) {}
35
nathangitter

Si vous souhaitez utiliser par défaut nil:

func foo(completionBlock: ((String) -> ())? = nil) {

}

Si votre bloc d'achèvement par défaut est très simple, vous pouvez utiliser une fermeture:

// A default completion block that is simple enough to fit on one line
func foo(completionBlock: (String) -> () = { result in print(result) }) {
    // ...
}

// A default completion block that does nothing
func foo(completionBlock: (String) -> () = {} ) {
    // ...
}

Si votre bloc d'achèvement par défaut est plus long qu'une ligne, mieux vaut le décomposer comme sa propre fonction:

func defaultCompletion(result: String) {
    // ...
}

func foo(completionBlock: ((String) -> ()) = defaultCompletion) {

}
34
Code Different