tutorial the programming logo lenguaje language apple ios swift

ios - logo - the swift programming language pdf



Swift: falta la etiqueta de argumento ''xxx'' en la llamada (5)

func say(name:String, msg:String) { println("/(name) say /(msg)") } say("Henry","Hi,Swift") <---- error because missing argument label ''msg'' in call

Necesito usar

say("Henry",msg:"Hi,Swift")

Por qué ? Si pongo más de dos var en func para que necesite escribir var nombre en lugar de first var cuando llamo a este func
Es realmente un problema, y ​​no veo ninguna explicación en el tutorial de iBook Swift.


Actualización de Swift 3.0:

En swift 3.0, se requiere que los métodos con un nombre de parámetro por entrada tengan ese nombre de parámetro como parte de la llamada a la función. Entonces, si defines la función como esta

func say(name:String, msg:String) { print("/(name) say /(msg)") }

Su llamada de función tendrá que ser así

self.say(name: "Henry",msg: "Hi,Swift")

Si desea tener etiquetas de funciones legibles en inglés pero no desea cambiar el nombre del parámetro de entrada, puede agregar la etiqueta al frente de los nombres de los parámetros, como este

func say(somethingBy name:String, whoIsActuallySaying msg:String) { print("/(name) say /(msg)") }

Luego llamándolo así

self.say(somethingBy: "Henry",whoIsActuallySaying: "Hi,Swift")


Esta es una peculiaridad en el compilador. Las funciones (que no son miembros de una clase) y los métodos de clase tienen un comportamiento predeterminado diferente con respecto a los parámetros nombrados. Esto es consistente con el comportamiento de los parámetros nombrados en el objetivo C (pero no tiene sentido que alguien nuevo cambie sin experiencia con el objetivo C).

Esto es lo que la referencia del lenguaje tiene que decir sobre los parámetros nombrados para las funciones (específicamente los parámetros donde no se da un nombre externo para el parámetro, y el parámetro no tiene un valor predeterminado)

Sin embargo, estos nombres de parámetros solo se utilizan dentro del cuerpo de la función en sí, y no se pueden usar al llamar a la función. Estos tipos de nombres de parámetros se conocen como nombres de parámetros locales, porque solo están disponibles para su uso dentro del cuerpo de la función.

Para obtener información sobre los métodos de clase, consulte la respuesta de Logan.


Esto es simplemente una influencia del lenguaje Objective-C. Cuando se llama a un método, el primer parámetro de un método no necesita ser explícitamente etiquetado (como en Objective-C, es efectivamente ''etiquetado'' por el nombre del método). Sin embargo, todos los parámetros SÍ necesitan un nombre para identificarlos. También pueden tomar un nombre local (opcional) para usar dentro del método en sí (ver el enlace de Jiaaro en los comentarios anteriores).


Una posible razón es que en realidad es un método. Los métodos son muy furtivos, se parecen a las funciones normales, pero no actúan de la misma manera, veamos esto:

func funFunction(someArg: Int, someOtherArg: Int) { println("funFunction: /(someArg) : /(someOtherArg)") } // No external parameter funFunction(1, 4) func externalParamFunction(externalOne internalOne: Int, externalTwo internalTwo: Int) { println("externalParamFunction: /(internalOne) : /(internalTwo)") } // Requires external parameters externalParamFunction(externalOne: 1, externalTwo: 4) func externalInternalShared(#paramOne: Int, #paramTwo: Int) { println("externalInternalShared: /(paramOne) : /(paramTwo)") } // The ''#'' basically says, you want your internal and external names to be the same // Note that there''s been an update in Swift 2 and the above function would have to be written as: func externalInternalShared(paramOne paramOne: Int, #paramTwo: Int) { print("externalInternalShared: /(paramOne) : /(paramTwo)") } externalInternalShared(paramOne: 1, paramTwo: 4)

Ahora esta es la parte divertida, declara una función dentro de una clase y ya no es una función ... es un método

class SomeClass { func someClassFunctionWithParamOne(paramOne: Int, paramTwo: Int) { println("someClassFunction: /(paramOne) : /(paramTwo)") } } var someInstance = SomeClass() someInstance.someClassFunctionWithParamOne(1, paramTwo: 4)

Esto es parte del diseño del comportamiento de los métodos

Documentos de Apple:

Específicamente, Swift da el nombre del primer parámetro en un método, un nombre de parámetro local de manera predeterminada, y le da a los nombres de los parámetros segundo y subsiguientes nombres de parámetros tanto locales como externos por defecto. Esta convención coincide con la convencional convención de nombres y llamadas con la que se familiarizará al escribir métodos Objective-C, y realiza llamadas a métodos expresivos sin la necesidad de calificar los nombres de los parámetros.

Observe la autocompleta:


Sencillo:

Sintaxis de función de llamada incorrecta (no es lo mismo en c / c ++ / java / c #)

Incorrecto:

say("Henry")

Correcto:

say(name:"Henry")

PD: ¡Debes siempre ! agrega " parámetro de función de nombre " antes del valor.