Lorsque je définirai la firstThing
valeur par défaut, nil
cela fonctionnera, sans la valeur par défaut de, nil
j'obtiens une erreur indiquant qu'il y a 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()
func test(firstThing: Int = 4)
: un non-Optional
paramètre avec une valeur par défaut. LeOptional
type (qui est ce?
à quoi un nom de type se développe) est un type valeur; "paramètre facultatif" est un nom malheureux pour un paramètre qui peut ou non être présent lors d'un appel de fonction, quel que soit son type.Réponses:
Les options et les paramètres par défaut sont deux choses différentes.
Un facultatif est une variable qui peut être
nil
, c'est tout.Les paramètres 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 à cecifunc test(param: Int?)
, vous ne pouvez pas l'appeler ainsitest()
. Même si le paramètre est facultatif, il n'a pas de valeur par défaut.Vous pouvez également combiner les deux et un paramètre qui prend une option où
nil
est la valeur par défaut, comme ceci:func test(param: Int? = nil)
.la source
L'argument par défaut vous permet d'appeler la fonction sans passer d'argument. Si vous ne passez pas l'argument, alors l'argument par défaut est fourni. Donc, en utilisant votre code, ceci ...
... est exactement la même chose:
Si vous omettez l'argument par défaut comme celui-ci ...
... alors vous ne pouvez plus faire cela ...
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 juste
nil
:la source
Swift n'est pas comme les langages comme JavaScript, où vous pouvez appeler une fonction sans passer les paramètres et elle sera toujours appelée. Donc, pour appeler une fonction dans Swift, vous devez attribuer une valeur à ses paramètres.
Les valeurs par défaut des paramètres vous permettent d'attribuer 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 ne pas inclure cette valeur par défaut, vous devez fournir la valeur de l'appel:
test(nil)
.De plus, et pas directement lié à cette question, mais il vaut probablement la peine de le noter, vous utilisez la manière "C ++" de traiter des pointeurs éventuellement nuls, pour traiter d'éventuelles options nil dans Swift. Le code suivant est plus sûr (spécialement dans les logiciels multithreading), et il vous permet d'éviter le déballage forcé de l'option:
la source
Vous confondez
Optional
avec une valeur par défaut. AnOptional
accepte une valeur ou une valeur nulle. Avoir une valeur par défaut permet à l'argument d'être omis lors de l'appel de la fonction. Un argument peut avoir une valeur par défaut avec ou sans être deOptional
type.Exemple d'appels avec sortie:
Résumer:
Optional
peut être nul ou peut contenir une instance de TypeOptional
et a la valeur par défaut, alors il peut être omis de l'appel de fonction OU peut être inclus et peut être fourni avec une valeur nil (par exemple param1: nil)la source
func getFilterNames(name: inout String){ }
ce qui vous permettra de modifier le nom qui a été transmis.au cas où vous auriez besoin d'utiliser un paramètre booléen, il vous suffit d'attribuer la valeur par défaut.
alors vous pouvez utiliser sans ou avec le paramètre:
la source
«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 prêter à confusion. Pour clarifier, il est plus précis de dire "paramètre de type facultatif" au lieu de "paramètre facultatif" car le mot "facultatif" ici n'est destiné qu'à décrire le type de valeur de paramètre et rien d'autre.
la source
Si vous voulez pouvoir appeler le
func
avec ou sans le paramètre, vous pouvez créer une secondefunc
du même nom qui appelle l'autre.vous pouvez maintenant appeler une fonction nommée
test
sans ou sans paramètre.la source
C'est peu compliqué lorsque vous essayez de combiner un paramètre facultatif et une valeur par défaut pour ce paramètre. Comme ça,
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, ce n'est plus un type facultatif maintenant car il a une valeur par défaut. Même si la valeur par défaut est nulle, 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 nil comme valeur par défaut.
la source
nil
).var foo: String; print(foo)
). Mais un argument de fonction avec une valeur par défaut est un argument optionnel (vous n'avez pas à le passer dans l'appel de fonction) et il peut aussi être de type facultatif (permettantnil
de lui être assigné, même comme valeur par défaut).La valeur par défaut ne signifie pas la valeur par défaut du type de données. Ici, la valeur par défaut signifie la valeur définie au moment de la définition de la fonction. nous devons déclarer la valeur par défaut de la variable tout en définissant la variable dans la fonction.
la source