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)