digamos 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?
Respuestas
64 para la respuesta № 1El compilador actual permite parámetros predeterminados en medio de una lista de parámetros.
Puede llamar a la función así si desea usar el valor predeterminado para el first
parámetro:
f(1)
Si desea proporcionar un nuevo valor para el first
parámetro, usa su nombre externo:
f(first: 3, 1)
La documentación explica a los parámetros con un valor predeterminado se les asigna automáticamente un nombre externo:
Swift proporciona un nombre externo automático para cualquierparámetro predeterminado que defina, si no proporciona un nombre externo. El nombre externo automático es el mismo que el nombre local, como si hubiera escrito un símbolo de hash antes del nombre local en su código.
12 para la respuesta № 2
Debe tener los parámetros predeterminados al final de la lista de parámetros.
func f(second:Int, first:Int = 100){}
f(10)
Colocar los parámetros con valores por defecto al final.de una función lista de parámetros Esto asegura que todas las llamadas a la función utilicen el mismo orden para sus argumentos no predeterminados, y deja claro que Se está llamando a la misma función en cada caso.
4 para la respuesta № 3
En Swift 3:
func defaultParameterBefore(_ x: Int = 1, y: Int ) {}
Vocación
defaultParameterBefore(2)
elevará este error
error: missing argument for parameter "y" in call
La única excepción es:
- Hay un parámetro antes del parámetro por defecto;
- 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 del cierre final
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
0 para la respuesta № 4
Si es un método en una clase, necesita 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, necesita llamarlo así:
f(4)
f(first: 30, 5)
Esto imprime:
first is 100
second is 4
first is 30
second is 5