Paramètre facultatif par défaut dans la fonction Swift

Lorsque firstThing à la valeur par défaut nil cela fonctionnera, sans la valeur par défaut nil Je reçois une erreur indiquant qu’il existe un paramètre manquant lors de l’appel de la fonction.

En tapant Int? Je pensais que cela le rendait facultatif avec une valeur par défaut de nil , ai-je raison? Et si oui, pourquoi ne fonctionne-t-il pas sans le = nil ?

 func test(firstThing: Int? = nil) { if firstThing != nil { print(firstThing!) } print("done") } test() 

Les parameters optionnels et par défaut sont deux choses différentes.

Une option est une variable qui peut être nil , c’est tout.

Les parameters par défaut utilisent une valeur par défaut lorsque vous omettez ce paramètre, cette valeur par défaut est spécifiée comme ceci: func test(param: Int = 0)

Si vous spécifiez un paramètre facultatif, vous devez le fournir, même si la valeur que vous souhaitez transmettre est nil . Si votre fonction ressemble à ce func test(param: Int?) , Vous ne pouvez pas l’appeler comme ce test() . Même si le paramètre est facultatif, il n’a pas de valeur par défaut.

Vous pouvez également combiner les deux et avoir un paramètre qui prend une option où nil est la valeur par défaut, comme ceci: func test(param: Int? = nil) .

L’argument par défaut vous permet d’appeler la fonction sans transmettre d’argument. Si vous ne passez pas l’argument, l’argument par défaut est fourni. Donc, en utilisant votre code, ceci …

 test() 

… est exactement la même chose que ceci:

 test(nil) 

Si vous omettez l’argument par défaut comme celui-ci …

 func test(firstThing: Int?) { if firstThing != nil { print(firstThing!) } print("done") } 

… alors tu ne peux plus faire ça …

 test() 

Si vous le faites, vous obtiendrez l’erreur “argument manquant” que vous avez décrite. Vous devez passer un argument à chaque fois, même si cet argument est simplement nil :

 test(nil) // this works 

Swift n’est pas comme les langages comme JavaScript, où vous pouvez appeler une fonction sans passer les parameters et elle sera toujours appelée. Donc, pour appeler une fonction dans Swift, vous devez atsortingbuer une valeur à ses parameters.

Les valeurs par défaut des parameters vous permettent d’atsortingbuer une valeur sans la spécifier lors de l’appel de la fonction. C’est pourquoi test() fonctionne lorsque vous spécifiez une valeur par défaut sur la déclaration du test.

Si vous n’incluez pas cette valeur par défaut, vous devez indiquer la valeur de l’appel: test(nil) .

De plus, et sans lien direct avec cette question, mais qui vaut probablement la peine d’être notée, vous utilisez la méthode “C ++” pour traiter les pointeurs éventuellement nuls, pour traiter d’éventuelles options nil dans Swift. Le code suivant est plus sûr (spécialement dans les logiciels de multithreading) et vous permet d’éviter le délocking forcé des options:

 func test(firstThing: Int? = nil) { if let firstThing = firstThing { print(firstThing) } print("done") } test() 

“Paramètre facultatif” signifie “le type de ce paramètre est facultatif”. Cela ne signifie pas “Ce paramètre est facultatif et peut donc être ignoré lorsque vous appelez la fonction”.

Le terme “paramètre facultatif” semble déroutant. Pour clarifier, il est plus exact de dire “paramètre de type facultatif” au lieu de “paramètre facultatif”, car le mot “facultatif” vise ici uniquement à décrire le type de la valeur du paramètre et rien d’autre.

Il est difficile de combiner les parameters facultatifs et la valeur par défaut pour ce paramètre. Comme ça,

 func test(param: Int? = nil) 

Ces deux idées sont complètement opposées. Lorsque vous avez un paramètre de type facultatif mais que vous lui fournissez également une valeur par défaut, il ne s’agit plus d’un type facultatif, car il a une valeur par défaut. Même si la valeur par défaut est nil, swift supprime simplement la liaison facultative sans vérifier la valeur par défaut.

Il est donc toujours préférable de ne pas utiliser la valeur par défaut.

Si vous avez besoin d’utiliser un paramètre bool, il vous suffit d’atsortingbuer la valeur par défaut.

 func test(WithFlag flag: Bool = false){.....} 

alors vous pouvez utiliser sans ou avec le param:

 test() test(WithFlag: true)