color bar swift function optional

bar - Parámetro opcional predeterminado en la función Swift



title color swift (8)

Cuando configuro firstThing en predeterminado nil esto funcionará, sin el valor predeterminado de nil aparece un error de que falta un parámetro al llamar a la función.

Al escribir Int? Pensé que lo hacía opcional con un valor predeterminado de nil , ¿estoy en lo cierto? Y si es así, ¿por qué no funciona sin el = nil ?

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


"Parámetro opcional" significa "el tipo de este parámetro es opcional". No significa "Este parámetro es opcional y, por lo tanto, puede ignorarse cuando se llama a la función".

El término "parámetro opcional" parece ser confuso. Para aclarar, es más preciso decir "parámetro de tipo opcional" en lugar de "parámetro opcional", ya que la palabra "opcional" aquí solo pretende describir el tipo de valor del parámetro y nada más.


El argumento predeterminado le permite llamar a la función sin pasar un argumento. Si no pasa el argumento, se proporciona el argumento predeterminado. Entonces, usando su código, esto ...

test()

... es exactamente lo mismo que esto:

test(nil)

Si omite el argumento predeterminado como este ...

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

... entonces ya no puedes hacer esto ...

test()

Si lo hace, obtendrá el error de "argumento perdido" que describió. Debe pasar un argumento cada vez, incluso si ese argumento es nil :

test(nil) // this works


Es un poco complicado cuando intenta combinar el parámetro opcional y el valor predeterminado para ese parámetro. Me gusta esto,

func test(param: Int? = nil)

Estas dos son ideas completamente opuestas. Cuando tiene un parámetro de tipo opcional pero también le proporciona un valor predeterminado, ya no es un tipo opcional ya que tiene un valor predeterminado. Incluso si el valor predeterminado es nil, swift simplemente elimina el enlace opcional sin verificar cuál es el valor predeterminado.

Por lo tanto, siempre es mejor no usar nil como valor predeterminado.


Está combinando Optional con tener un valor predeterminado. Un Optional acepta un valor o nulo. Tener un valor predeterminado permite omitir el argumento al llamar a la función. Un argumento puede tener un valor predeterminado con o sin ser de tipo Optional .

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

Ejemplo de llamadas con salida:

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

Para resumir:

  • Escriba con? (por ejemplo, ¿Cadena?) es un Optional puede ser nulo o puede contener una instancia de Tipo
  • El argumento con el valor predeterminado puede omitirse de una llamada a la función y se utilizará el valor predeterminado
  • Si tanto Optional como predeterminado, puede omitirse de la llamada a la función O puede incluirse y puede proporcionarse con un valor nulo (por ejemplo, param1: nil)

Los parámetros opcionales y predeterminados son dos cosas diferentes.

Un Opcional es una variable que puede ser nil , eso es todo.

Los parámetros predeterminados usan un valor predeterminado cuando omite ese parámetro, este valor predeterminado se especifica así: func test(param: Int = 0)

Si especifica un parámetro que es opcional, debe proporcionarlo, incluso si el valor que desea pasar es nil . Si su función se parece a esta func test(param: Int?) , No puede llamarla así test() . Aunque el parámetro es opcional, no tiene un valor predeterminado.

También puede combinar los dos y tener un parámetro que toma un valor opcional donde nil es el valor predeterminado, como este: func test(param: Int? = nil) .


Si desea poder llamar al func con o sin el parámetro, puede crear un segundo func del mismo nombre que llame al otro.

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

ahora puede llamar a una función llamada test sin o sin el parámetro.

// both work test() test(firstThing: 5)


Swift no es como lenguajes como JavaScript, donde puede llamar a una función sin pasar los parámetros y aún se llamará. Entonces, para llamar a una función en Swift, debe asignar un valor a sus parámetros.

Los valores predeterminados para los parámetros le permiten asignar un valor sin especificarlo al llamar a la función. Es por eso que test() funciona cuando especifica un valor predeterminado en la declaración de prueba.

Si no incluye ese valor predeterminado, debe proporcionar el valor en la llamada: test(nil) .

Además, y no está directamente relacionado con esta pregunta, pero probablemente valga la pena tener en cuenta, está utilizando la forma "C ++" de tratar con punteros posiblemente nulos, para tratar con posibles opciones nulas en Swift. El siguiente código es más seguro (especialmente en software de subprocesos múltiples) y le permite evitar el desenvolvimiento forzado de lo opcional:

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


en caso de que necesite usar un parámetro bool, solo necesita asignar el valor predeterminado.

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

entonces puedes usar sin o con el parámetro:

test() test(WithFlag: true)