Lorsque je règle firstThing
sur la valeur par défaut nil
, cela fonctionnera, sans la valeur par défaut de nil
, un message d'erreur indiquant qu'un paramètre manque lors de l'appel de la fonction.
En tapant Int?
, je pensais que cela devenait 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 options et les paramètres par défaut sont deux choses différentes.
Une option 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 suit: 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 à ceci func test(param: Int?)
, vous ne pouvez pas l'appeler comme ceci 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 passer d'argument. Si vous ne transmettez pas l'argument, l'argument par défaut est fourni. Donc, en utilisant votre code, cela ...
test()
... est exactement le même que celui-ci:
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 vous ne pouvez 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 paramètres et ce sera quand même appelé. Donc, pour appeler une fonction dans Swift, vous nécessité d'assigner une valeur à ses paramètres.
Les valeurs par défaut des paramètres vous permettent d'affecter 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 dans la déclaration du test.
Si vous n'incluez pas cette valeur par défaut, vous devez fournir la valeur de l'appel: test(nil)
.
De plus, et vous n'êtes probablement pas directement lié à cette question, mais il est probablement intéressant de noter que vous utilisez la méthode "C++" pour traiter les pointeurs éventuellement nuls, pour traiter les options nil possibles dans Swift. Le code suivant est plus sûr (en particulier dans les logiciels multithreading) et vous permet d’éviter le déballage forcé de l’option:
func test(firstThing: Int? = nil) {
if let firstThing = firstThing {
print(firstThing)
}
print("done")
}
test()
Vous associez Optional
à une valeur par défaut. Un Optional
accepte une valeur ou nil. Avoir un 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 de type Optional
.
func someFunc(param1: String?,
param2: String = "default value",
param3: String? = "also has default value") {
print("param1 = \(param1)")
print("param2 = \(param2)")
print("param3 = \(param3)")
}
Exemple d'appels avec sortie:
someFunc(param1: nil, param2: "specific value", param3: "also specific value")
param1 = nil
param2 = specific value
param3 = Optional("also specific value")
someFunc(param1: "has a value")
param1 = Optional("has a value")
param2 = default value
param3 = Optional("also has default value")
someFunc(param1: nil, param3: nil)
param1 = nil
param2 = default value
param3 = nil
Résumer:
Optional
peut être nul ou contenir une instance de TypeOptional
et a par défaut, l'appel de fonction OR peut être omis et peut être fourni avec une valeur nulle (par exemple, param1: nil)."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 être source de confusion. Pour clarifier, il est plus exact de dire "paramètre de type facultatif" au lieu de "paramètre facultatif" car le mot "facultatif" ne vise ici qu'à décrire le type de valeur du paramètre et rien d'autre.
au cas où vous auriez besoin d'utiliser un paramètre bool, il vous suffira d'attribuer la valeur par défaut.
func test(WithFlag flag: Bool = false){.....}
alors vous pouvez utiliser sans ou avec le param:
test()
test(WithFlag: true)
Si vous voulez pouvoir appeler le func
avec ou sans le paramètre, vous pouvez créer un second func
du même nom qui appelle l'autre.
func test(firstThing: Int?) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
func test() {
test(firstThing: nil)
}
vous pouvez maintenant appeler une fonction nommée test
sans ou sans le paramètre.
// both work
test()
test(firstThing: 5)