¿Cuál es el _ subrayado representante de Swift References?

En la sección de referencia de los documentos de Apple hay muchas instancias de este tipo de cosas:

func runAction(_ action : SKAction!)

El Objective-C ‘equivalente’ de esto es:

- (void)runAction:(SKAction *) action

Me parece que es importante que (en la referencia de Swift) haya un espacio después del guión bajo y “acción” esté escrito en cursiva.

Pero no puedo entender lo que esto está tratando de transmitir. Entonces, quizás 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 al uso del guión bajo: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction

Actualizar

Swift 3 ha realizado algunos cambios en la forma en que se usan y nombran los nombres de los parámetros de función / método y las tags de los argumentos. Esto tiene ramificaciones en esta pregunta y su respuesta. @Rickster hace un trabajo increíble respondiendo a una pregunta diferente sobre los “indicadores de puntadas” en funciones que aclaran gran parte de esto, aquí: ¿Por qué necesito guiones bajos en poco tiempo?

Ambas respuestas fueron correctas, pero quiero aclarar un poco más.

_ se usa para modificar el comportamiento del nombre del parámetro externo para los métodos .

En los nombres de los parámetros locales y externos para los métodos de la documentación, dice:

Swift da el nombre del primer parámetro en un método, un nombre de parámetro local de manera predeterminada, y le da al segundo nombre de parámetro y subsecuentemente nombres de parámetro tanto locales como externos por defecto.

Por otro lado, las funciones por defecto no tienen nombres de parámetros externos.

Por ejemplo, tenemos este método foo() definido en la clase Bar :

 class Bar{ func foo(s1: String, s2: String) -> String { return s1 + s2; } } 

Cuando llamas a foo() , se llama como bar.foo("Hello", s2: "World") .

Pero puede anular este comportamiento usando _ delante de s2 donde está declarado.

 func foo(s1: String, _ s2: String) -> String{ return s1 + s2; } 

Luego, cuando llame a foo , podría simplemente llamarse como bar.foo("Hello", "World") sin el nombre del segundo parámetro.

Volviendo a su caso, runAction es un método porque está asociado con el tipo SKNode , obviamente. Por lo tanto, al poner una action parámetro _ antes le permite llamar a runAction 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 statement de nombre de argumento local y externo.

Las funciones ahora se llaman usando el nombre de parámetro externo de forma predeterminada, comenzando en el 2do parámetro. Esta regla solo se aplica al código Swift puro.

Entonces, al proporcionar un _ en frente de una función , la persona que llama no tendrá que especificar el nombre del parámetro externo, tal como lo haría con un método .

El guión bajo es un token general usado para indicar un valor descartado.

En este caso específico, significa que la función se invocará como runAction(argument) lugar de runAction(action:argument)

En otros contextos, tiene otro significado similar, por ejemplo, en:

 for _ in 0..<5 { ... } 

Significa que solo queremos ejecutar el bloque 5 veces y no nos importa el índice dentro del bloque.

En este contexto:

 let (result, _) = someFunctionThatReturnsATuple() 

Significa que no nos importa cuál es el segundo elemento de la tupla, solo el primero.

Un identificador delante de la statement de parámetro define un nombre de parámetro externo . Este es el nombre que debe proporcionar la persona que llama cuando llama a la función:

 func someFunction(externalParameterName localParameterName: Int) 

Swift proporciona un nombre externo automático para cualquier parámetro predeterminado que defina, si usted mismo no proporciona un nombre externo. Al utilizar un guión bajo para el nombre del parámetro externo, se opta por este comportamiento:

Para inhabilitar este comportamiento, escriba un guión bajo ( _ ) en lugar de un nombre externo explícito cuando defina el parámetro.

Puede leer más sobre este comportamiento en la sección sobre Nombres Externos para Parámetros con Valores Predeterminados aquí .

Desde Swift 3 todas las tags de argumentos son requeridas por defecto .

Puede forzar un IDE para ocultar una etiqueta de argumento con _ .

 func foo(a: String) { } func foo2(_ a: String) { } 

llamado foo(a: "abc") y foo2("abc")

Nota: Esto se puede usar solo cuando a es la etiqueta de argumento (externa) y el nombre de la variable (interna) al mismo tiempo. Es equivalente – func foo(aa: String) no aceptará el _ .

¿Por qué Apple lo usa?

Puede ver que Apple lo está utilizando en la API. Las bibliotecas de Apple todavía están escritas en Objective-C (si no, comparten los mismos nombres de funciones, que fueron diseñados para la syntax de Objective-C)

Funciones como applicationWillResignActive(_ application: UIApplication) tendrían application nombre de parámetro redundante , ya que ya existe la aplicación en su nombre de función.

Tu ejemplo

func runAction(_ action: SKAction!) sin su marca _ como runAction(action:) . La action nombre del parámetro sería redundante ya que ya hay uno en el nombre de la función. Ese es el propósito y por qué está allí.

Creo que esto obliga a una convención en Swift que la hace leer más cerca del objective-c, que combina mejor con las convenciones del cocoa. En objc, no nombra (externamente) su primer parámetro. En cambio, por convención, generalmente se incluye el nombre externo en la última parte del nombre del método como este:

 - (void)myFancyMethodWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName; [someInstance myFancyMethodWithFirstName:@"John" lastName:@"Doe"]; 

Para realizar llamadas api Swift consistentes con objc, querrá suprimir el nombre del parámetro externo del primer parámetro.

 func myFancyMethodWithFirstName(_ firstName:String, lastName:String); someInstance.myFancyMethodWithFirstName("John", lastName:"Doe") 

En realidad, existe una diferencia entre el código real utilizado para definir un método y la statement del método en los documentos de Apple. Tomemos el método UIControl ‘s – addTarget: action: forControlEvents: por ejemplo, el código real es: enter image description here

Pero en documentos, aparece así (aviso _ antes del objective): enter image description here

En código real, _ se utiliza para hacer que el nombre externo del segundo parámetro o posterior no aparezca cuando se invoca un método, mientras que en documentos, _ antes de que el nombre local de un parámetro indique que cuando 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 por defecto, a menos que proporcione la suya o agregue # antes (sin espacio en blanco) el nombre local de un parámetro, por ejemplo, así es como usamos dispatch_after : enter image description here

Y en documentos, aparece así (observe tres _): enter image description here

La convención de la statement de la función es exactamente la misma que he descrito para el método.

Solo más visualmente.

enter image description here

Como puede ver, _ simplemente haga omitir un nombre de parámetro local o no.