/ / Swift: función con el parámetro predeterminado antes del parámetro no predeterminado - swift

Swift: función con el parámetro predeterminado antes del parámetro no predeterminado - swift

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 № 1

El compilador actual permite parámetros predeterminados en medio de una lista de parámetros.

captura de pantalla de Playground

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.

Enlace de documentación


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