Aquí hay un ejemplo de lo que estoy hablando: https://developer.apple.com/documentation/foundation/nsmutableorderedset/1410287-insert
La función de inserción se muestra como insert(_:at:)
Cuando se usa realmente, la función de inserción se parece más a:
namesArray.insert("John", at: 3)
No hay : después de "John" (aunque supongo que podría ser "John":String -- ¿para eso está ahí?), y el , que en realidad necesita ir allí, no se menciona en la firma de la función en la documentación. ¿Se supone que debo saber/asumir que la coma va allí cuando realmente la uso? ¿Es este el caso para todas las funciones de Swift?
Tenga en cuenta que esta no es una pregunta sobre el guión bajo, _ -- Entiendo por qué está ahí y para qué sirve. Estoy preguntando específicamente sobre las razones para incluir : y no incluir , en la firma de la función.
La convención, que se ve con frecuencia en la documentación, es una forma concisa de referirse a una función, utilizando solo el nombre de la función y las etiquetas de los argumentos.
Así que considere esta declaración de función:
func insert(_ objects: [Any], at indexes: IndexSet)Este es
insert ;objects , este parámetro no tiene etiqueta de argumento (designado con _ ) y tiene un tipo de [Any] ; yindexes , su etiqueta de argumento está at y tiene un tipo de IndexSet .Entonces lo llamas así:
insert(someObjects, at: someIndex)Cuando lo llama, no le importa cuáles son los nombres de los parámetros que se usan dentro de esa función, sino cuáles son las etiquetas de los argumentos. Por lo tanto, la convención al referirse a ese método en la documentación es omitir los nombres y tipos de parámetros y simplemente usar el nombre de la función y las etiquetas de los argumentos, pero sin coma:
insert(_:at:)Tenga en cuenta que nunca usaría esta sintaxis en su código. Esta es solo una convención de documentación empleada para destilar declaraciones de funciones largas en algo más manejable y conciso:
Para obtener más información sobre etiquetas de argumentos y nombres de parámetros, consulte Etiquetas de argumentos de funciones y nombres de parámetros
R : en la función, la firma siempre significa un argumento de entrada para la función. La firma de la función contiene la etiqueta del argumento seguida de : . El _ significa que no hay una etiqueta de argumento, en cuyo caso también puede omitir el : al proporcionar ese argumento de entrada específico a la llamada de función.
Esto es exactamente lo que ve con la función insert(_:at:) . Le proporciona dos argumentos de entrada, "John" y 3 , pero solo necesita una etiqueta de argumento para el segundo argumento de entrada, por lo tanto, solo necesita uno : . También es importante tener en cuenta que, en el momento de la llamada, separa los argumentos de entrada usando , , no : .
Las funciones Swift tienen una forma única de especificar la firma, que es un patrón de transferencia de Objective C. Hay 3 partes para especificar cada argumento de entrada a la firma de la función. La firma para la función que mencionaste es la siguiente:
func insert(_ objects: [Any], at indexes: IndexSet)Veamos primero el segundo argumento:
at indica la etiqueta del argumento , que es cómo la persona que llama especifica el parámetro.indexes indica el nombre del parámetro de la función al objeto. Esto significa que en el cuerpo de la función, todo lo que se haya pasado como at: se denominará indexes .IndexSet es el tipo del argumento.La parte 1 también puede ser algo además de un nombre:
func insert(objects: [Any], indexes: IndexSet) , la función se llamaría como o.insert(objects: ['a','b'], at: [1,2]) ._ ), entonces el argumento no tiene etiqueta para la persona que llama. Esto permite que la persona que llama use la llamada más simple e intuitiva o.insert(['a','b'], at: [1,2]) .