166 votes

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

Lorsque je règle firstThing par défaut à nil cela fonctionnera, sans la valeur par défaut de nil un message d'erreur me signalant qu'il manque un paramètre 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 cela ne fonctionne-t-il pas sans les = nil ?

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

299voto

EmilioPelaez Points 3561

Options et 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 utiliser une valeur par défaut lorsque vous omettez ce paramètre, la valeur par défaut est spécifié comme ceci: func test(param: Int = 0)

Si vous spécifiez un paramètre est facultatif, vous l'assurer, même si la valeur que vous souhaitez passer est - nil. Si votre fonction se présente func test(param: Int?), vous ne pouvez pas l'appeler comme cela test(). Même si le paramètre est optionnel, il n'a pas de valeur par défaut.

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

28voto

Aaron Rasmussen Points 9973

L'argument par défaut vous permet d'appeler la fonction sans passer par un argument. Si vous ne passez pas le paramètre, alors l'argument par défaut est fourni. Donc, à l'aide de votre code, ce...

test()

...est exactement la même chose que ceci:

test(nil)

Si vous laissez la valeur par défaut de l'argument comme ça...

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

...alors vous ne pouvez plus le faire...

test()

Si vous le faites, vous obtiendrez le "manque d'erreur" argument que vous avez décrit. Vous devez passer un argument à chaque fois, même si cet argument est juste nil:

test(nil)   // this works

26voto

nbloqs Points 1988

Swift n'est pas comme les langages comme JavaScript, où vous pouvez appeler une fonction sans passer les paramètres et il sera toujours appelé. Afin d'appeler une fonction dans Swift, vous devez attribuer une valeur à ses paramètres.

Les valeurs par défaut pour les paramètres vous permettent d'assigner une valeur, sans le spécifier lors de l'appel de la fonction. C'est pourquoi, test() fonctionne lorsque vous spécifiez une valeur par défaut sur le test de la déclaration.

Si vous n'avez pas inclure cette valeur par défaut, vous devez fournir la valeur de l'appel: test(nil).

Aussi, et non pas directement liée à cette question, mais sans doute vaut la peine de noter, vous utilisez le "C++" façon de traiter avec éventuellement des pointeurs null, pour faire face à d'éventuels néant options de Swift. Le code suivant est plus sûr (spécialement dans le multithreading logiciel), et il permet d'éviter la contrainte d'ôter de l'option:

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

16voto

Chuck Krutsinger Points 678

Vous êtes de juxtaposer Optional avec une valeur par défaut. Un Optional accepte une valeur ou le néant. Ayant un défaut de permis de l'argument omis dans l'appel de la fonction. Un argument peut avoir une valeur par défaut, avec ou sans cours de Optional type.

func someFunc(param1: String?,
          param2: String = "default value",
          param3: String? = "also has default value") {
    print("param1 = \(param1)")

    print("param2 = \(param2)")

    print("param3 = \(param3)")
}

Exemple les appels à la 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

Pour résumer:

  • Type avec ? (Chaîne de caractères?) est un Optional peut être nul ou peut contenir une instance de Type
  • Argument avec la valeur par défaut peut être omis à partir d'un appel à la fonction et la valeur par défaut sera utilisée
  • Si les deux Optional et a défaut, il peut être omis à partir de l'appel de fonction OU peut-être inclus et peuvent être fournis avec une valeur nulle (par exemple, param1: néant)

3voto

Todanley Points 142

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X