the - Swift: función con parámetro predeterminado antes del parámetro no predeterminado
swift(lenguaje de programación) (4)
Debería tener los parámetros predeterminados al final de la lista de parámetros.
func f(second:Int, first:Int = 100){}
f(10)
Coloque los parámetros con los valores predeterminados al final de la lista de parámetros de una función. Esto garantiza que todas las llamadas a la función usen el mismo orden para sus argumentos no predeterminados, y deja en claro que se está llamando a la misma función en cada caso.
Supongamos que tengo una función que tiene un parámetro no predeterminado después de un parámetro predeterminado como este:
func f(first:Int = 100, second:Int){}
¿Cómo puedo llamarlo y usar el valor predeterminado para el primer parámetro?
El compilador actual permite los parámetros predeterminados en el medio de una lista de parámetros.
Puede llamar a la función de esta manera si desea usar el valor predeterminado para el first
parámetro:
f(1)
Si desea proporcionar un nuevo valor para el first
parámetro, use su nombre externo:
f(first: 3, 1)
La documentación explains que los parámetros con un valor predeterminado reciben automáticamente un nombre externo:
Swift proporciona un nombre externo automático para cualquier parámetro predeterminado que defina, si usted mismo no proporciona un nombre externo. El nombre externo automático es el mismo que el nombre local, como si hubiera escrito un símbolo hash antes del nombre local en su código.
En Swift 3:
func defaultParameterBefore(_ x: Int = 1, y: Int ) {}
Vocación
defaultParameterBefore(2)
levantará este error
error: missing argument for parameter ''y'' in call
La única excepción es:
- Hay un parámetro antes del parámetro predeterminado;
- y el parámetro después del parámetro predeterminado es un cierre;
- y el parámetro de cierre es el último parámetro;
- y llamando a través de un cierre posterior
Por ejemplo:
func defaultParameterBetween(_ x: Int, _ y: Bool = true, _ z: String) {
if y {
print(x)
} else
z()
}
}
// error: missing argument for parameter #3 in call
// defaultParameterWithTrailingClosure(1, { print(0) }
// Trailing closure does work, though.
func defaultParameterWithTrailingClosure(_ x: Int, y: Bool = true,
_ z: () -> Void) {
if y {
print(x)
} else {
z()
}
}
defaultParameterWithTrailingClosure(1) { print(0) }
versión rápida : DEVELOPMENT-SNAPSHOT-2016-04-12
Si es un método en una clase, debe llamarlo así
class Test
{
func f(first:Int = 100, second:Int)
{
println("first is /(first)")
println("second is /(second)")
}
func other()
{
f(second: 4)
f(first: 30, second: 5)
//f(4) will not compile, and neither will f(9,12)
}
}
Si la función f es global, debe llamarla así:
f(4)
f(first: 30, 5)
Esto imprime:
first is 100
second is 4
first is 30
second is 5