En la sección de referencia de los documentos de Apple hay muchas instancias de este tipo de cosas:
func runAction(_
action
: SKAction!)
El 'equivalente' del objetivo C de esto es:
- (void)runAction:(SKAction *)
action
Me sorprende que probablemente sea importante que (en la referencia de Swift) haya un espacio después del guión bajo y la "acción" esté escrita en cursiva.
Pero no puedo entender lo que esto está tratando de transmitir. Entonces, tal vez la pregunta es ... ¿hay alguna referencia para las convenciones utilizadas en las referencias?
- Aquí está la página a la que me refiero en esta referencia para el uso de subrayado: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction
Actualizar
Swift 3 ha realizado algunos cambios en cómo se usan y nombran los nombres de parámetros de función / método y las etiquetas de argumento. Esto tiene ramificaciones en esta pregunta y su respuesta. @Rickster hace un trabajo increíble al responder una pregunta diferente sobre _coincidencia en funciones que aclara gran parte de esto, aquí: ¿Por qué necesito guiones bajos rápidamente?
fuente
Respuestas:
Ambas respuestas fueron correctas, pero quiero aclarar un poco más.
_
se utiliza para modificar el comportamiento del nombre del parámetro externo para los métodos .En la sección Nombres de parámetros locales y externos para métodos de la documentación, dice:
Por otro lado, las funciones por defecto no tienen nombres de parámetros externos.
Por ejemplo, tenemos este
foo()
método definido en la claseBar
:Cuando llamas
foo()
, se llama comobar.foo("Hello", s2: "World")
.Pero , puede anular este comportamiento al usarlo
_
delante des2
donde se declara.Luego, cuando llame
foo
, podría simplemente llamarse comobar.foo("Hello", "World")
sin el nombre del segundo parámetro.Volviendo a su caso,
runAction
es un método porque está asociado con el tipoSKNode
, obviamente. Por lo tanto, poner un_
parámetro antes leaction
permite llamarrunAction
sin un nombre externo.Actualización para Swift 2.0
La función y el método ahora funcionan de la misma manera en términos de declaración de nombre de argumento local y externo.
Las funciones ahora se invocan utilizando el nombre del parámetro externo de forma predeterminada, comenzando en el segundo parámetro. Esta regla solo se aplica al código Swift puro.
Entonces, al proporcionar un
_
frente a una función , la persona que llama no tendrá que especificar el nombre del parámetro externo, al igual que lo que haría para un método .fuente
_
escribe antes del segundo parámetro, su respuesta es claramente suficiente; ¿Qué pasa si enfunc runAction(_action: SKAction!)
, el_
está antes del primer parámetro o si escribe el siguiente códigofunc foo(_ s1: String) { // your code }
Xcode le daría una advertencia, pero hay un código de lote comofunc bringSubviewToFront(_ view: UIView)
en la referencia, ¿por qué?_
primer parámetro es extraño. Puedo suponer que los diseñadores piensan que obviamente es suficiente para su código y no mejora la legibilidad, sino todo lo contrario, ensucia el código. Entonces recibes la advertencia. La referencia tiene el objetivo opuesto: debe ser lo más claro posible, por lo que se menciona el guión bajo del primer parámetro para CADA método. Eso explicaría todo)-
antes del primer parámetro ya no es extraño. Por ejemplo:override func viewWillAppear(_ animated: Bool)
indica que la persona que llama (código Objective-C) no usará una etiqueta de parámetroEl guión bajo es un token general utilizado para indicar un valor descartado.
En este caso específico, significa que la función se invocará como en
runAction(argument)
lugar derunAction(action:argument)
En otros contextos tiene otro significado similar, por ejemplo, en:
Significa que simplemente queremos ejecutar el bloque 5 veces y no nos importa el índice dentro del bloque.
En este contexto:
Significa que no nos importa cuál es el segundo elemento de la tupla, solo el primero.
fuente
let pi = 3.141_592_653_59
let pi = 3.1_4_15_92___63
Desde Swift 3, todas las etiquetas de argumentos son necesarias de forma predeterminada .
Puede forzar un IDE para ocultar una etiqueta de argumento
_
.llamado
foo(a: "abc")
yfoo2("abc")
¿Por qué lo está usando Apple?
Puedes ver que Apple lo está utilizando en toda la API. Las bibliotecas de Apple todavía están escritas en Objective-C (de lo contrario, comparten los mismos nombres de función de todos modos, que fueron diseñados para la sintaxis de Objective-C)
Funciones como
applicationWillResignActive(_ application: UIApplication)
tendrían un nombre de parámetro redundanteapplication
, ya que ya existe la aplicación en su nombre de función.Su ejemplo
func runAction(_ action: SKAction!)
se llamaría sin su_
marca comorunAction(action:)
. El nombre del parámetroaction
sería redundante ya que ya hay uno en el nombre de la función. Ese es el propósito y por qué está ahí.fuente
Un identificador delante de la declaración de parámetro define un nombre de parámetro externo . Este es el nombre que debe proporcionar la persona que llama al llamar a la función:
Swift proporciona un nombre externo automático para cualquier parámetro predeterminado que defina, si no proporciona un nombre externo usted mismo. El uso de un guión bajo para el nombre del parámetro externo se excluye de este comportamiento:
Puede leer más sobre este comportamiento en la sección de Nombres externos para parámetros con valores predeterminados aquí .
fuente
SK
los diseñadores no quieren que escribaaction
dos veces, porque "acción" ya es parte del nombre de la función. En otras palabras, no quieren que escribassprite.runAction(action:moveGroundSpritesForever)
. El propósito de los nombres de parámetros externos era hacer que su código "se lea como una oración"; usaraction
dos veces sería contrario al propósito de eso.foo.bar(param: 'fiddle')
yfoo.bar('fiddle')
NOTA: con solo un argumento realmente no se vuelve aparente ... pero con múltiples argumentos se vuelve muy relevante:foo.bar(param1: 'fiddle', param2: 'dee')
vsfoo.bar('fiddle','dee')
Creo que esto obliga a una convención en Swift que lo hace leer más cerca del objetivo-c, que coincide mejor con las convenciones del cacao. En objc no nombra (externamente) su primer parámetro. En cambio, por convención, generalmente incluye el nombre externo en la última parte del nombre del método de esta manera:
Para hacer que las llamadas a la API de Swift sean coherentes con objc, deberá suprimir el nombre del parámetro externo del primer parámetro.
fuente
En realidad, hay una diferencia entre el código real utilizado para definir un método y la declaración del método en los documentos de Apple. Tomemos UIControl 's - addTarget: action: forControlEvents: método por ejemplo, el código real es:
Pero en documentos, aparece así (aviso _ antes del objetivo):
En el código real, _ se utiliza para hacer que el nombre externo del segundo parámetro o posterior no aparezca cuando se llama a un método, mientras que en documentos, _ antes del nombre local de un parámetro indica que cuando se llama a un método o una función, no debe proporcionar un nombre externo
No hay un nombre externo cuando se llama a una función de manera predeterminada a menos que proporcione el suyo propio o agregue # antes (sin espacios en blanco) el nombre local de un parámetro, por ejemplo, así es como utilizamos dispatch_after :
Y en documentos, aparece así (nota tres _):
La convención de la declaración de la función es la misma que he descrito para el método.
fuente
Solo más visualmente.
Como puede ver,
_
simplemente omita un nombre de parámetro local o no.fuente