Cuando establezco el firstThing
valor predeterminado, nil
esto funcionará, sin el valor predeterminado de nil
, obtengo 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()
func test(firstThing: Int = 4)
: un noOptional
parámetro con un valor predeterminado. ElOptional
tipo (que es lo que?
en un nombre de tipo se expande) es un tipo de valor; "parámetro opcional" es un nombre desafortunado para un parámetro que puede estar presente o no en una llamada de función, independientemente de su tipo.Respuestas:
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 ve asífunc test(param: Int?)
, no puede llamarla asítest()
. Aunque el parámetro es opcional, no tiene un valor predeterminado.También se pueden combinar los dos y tener un parámetro que tiene una opción donde
nil
es el valor por defecto, como esto:func test(param: Int? = nil)
.fuente
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 tu código, esto ...
... es exactamente lo mismo que esto:
Si omite el argumento predeterminado como este ...
... entonces ya no podrás hacer esto ...
Si lo hace, obtendrá el error "argumento faltante" que describió. Debe pasar un argumento cada vez, incluso si ese argumento es solo
nil
:fuente
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 se incluye ese valor por defecto, es necesario proporcionar el valor de la llamada:
test(nil)
.Además, y no está directamente relacionado con esta pregunta, pero probablemente valga la pena señalarlo, está utilizando la forma "C ++" de tratar con punteros posiblemente nulos, para tratar con posibles opcionales nulos en Swift. El siguiente código es más seguro (especialmente en software de subprocesos múltiples) y le permite evitar el desenvolvimiento forzado del opcional:
fuente
Estás confundiendo
Optional
con tener un valor predeterminado. AnOptional
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 deOptional
tipo.Ejemplo de llamadas con salida:
Para resumir:
Optional
puede ser nulo o puede contener una instancia de TypeOptional
y tienen el valor predeterminado, entonces se puede omitir de la llamada a la función O se puede incluir y se le puede proporcionar un valor nulo (por ejemplo, param1: nil)fuente
func getFilterNames(name: inout String){ }
que le permitirá modificar el nombre que se pasó.en caso de que necesite usar un parámetro bool, solo necesita asignar el valor predeterminado.
entonces puedes usar sin o con el parámetro:
fuente
"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 al llamar a la función".
El término "parámetro opcional" parece confuso. Para aclarar, es más exacto 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 de parámetro y nada más.
fuente
Si desea poder llamar al
func
con o sin el parámetro, puede crear un segundo confunc
el mismo nombre que llame al otro.ahora puede llamar a una función nombrada
test
sin o sin el parámetro.fuente
Es un poco complicado cuando intenta combinar un parámetro opcional y un valor predeterminado para ese parámetro. Me gusta esto,
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 tanto, siempre es mejor no utilizar nil como valor predeterminado.
fuente
nil
).var foo: String; print(foo)
). Pero un argumento de función con un valor predeterminado es un argumento opcional (no tiene que pasarlo en la llamada a la función) y también puede ser de tipo Opcional (permitiendonil
que se le asigne, incluso como valor predeterminado).El valor predeterminado no significa el valor predeterminado del tipo de datos. Aquí el valor predeterminado es el valor medio definido en el momento de definir la función. tenemos que declarar el valor predeterminado de la variable al definir la variable en función.
fuente