web-dev-qa-db-fra.com

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

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()
83
RickBrunstedt

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).

149
EmilioPelaez

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
17
Aaron Rasmussen

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()
16
nbloqs

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:

  • Tapez avec? (par exemple, String?) est un Optional peut être nul ou contenir une instance de Type
  • L'argument avec valeur par défaut peut être omis lors d'un appel à fonction et la valeur par défaut sera utilisée
  • Si Optional 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).
3
Chuck Krutsinger

"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.

1
Todanley

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)
0
Niib Fouda

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)
0
Sean256