Na seção de referência dos documentos da Apple, existem muitas instâncias desse tipo de coisa:
func runAction(_
action
: SKAction!)
O 'Objetivo-C' equivalente 'disso é:
- (void)runAction:(SKAction *)
action
Parece-me que provavelmente é importante que (na referência Swift) exista um espaço após o sublinhado e a "ação" serem escritas em itálico.
Mas não consigo descobrir o que isso está tentando transmitir. Então talvez a pergunta seja ... existe uma referência para as convenções usadas nas referências?
- aqui está a página que estou referenciando nesta referência ao uso de sublinhado: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction
Atualizar
O Swift 3 fez algumas alterações na maneira como os nomes de parâmetros de função / método e os rótulos de argumentos são usados e nomeados. Isso tem implicações sobre esta questão e sua resposta. O @Rickster faz um trabalho incrível ao responder a uma pergunta diferente sobre _underscores em funções que esclarece muito isso aqui: Por que preciso de sublinhados rapidamente?
fonte
Respostas:
Ambas as respostas estavam corretas, mas quero esclarecer um pouco mais.
_
é usado para modificar o comportamento do nome do parâmetro externo para métodos .Na seção Nomes de Parâmetros Locais e Externos para Métodos da documentação, ele diz:
Por outro lado, funções por padrão não possuem nomes de parâmetros externos.
Por exemplo, temos este
foo()
método definido na classeBar
:Quando você liga
foo()
, é chamado comobar.foo("Hello", s2: "World")
.Mas , você pode substituir esse comportamento usando
_
na frente des2
onde ele foi declarado.Então, quando você chama
foo
, pode ser chamado simplesmente comobar.foo("Hello", "World")
sem o nome do segundo parâmetro.De volta ao seu caso,
runAction
é um método porque está associado ao tipoSKNode
, obviamente. Assim, colocar um_
parâmetro beforeaction
permite que você chamerunAction
sem um nome externo.Atualização para Swift 2.0
Função e método agora funcionam da mesma maneira em termos de declaração de nome de argumento local e externo.
As funções agora são chamadas usando o nome do parâmetro externo por padrão, iniciando no segundo parâmetro. Esta regra se aplica apenas ao código Swift puro.
Portanto, fornecendo um
_
na frente de uma função , o chamador não precisará especificar o nome do parâmetro externo, exatamente como o que você faria para um método .fonte
_
gravação antes do segundo parâmetro, sua resposta é clara o suficiente; what if infunc runAction(_action: SKAction!)
, the_
é antes do primeiro parâmetro ou se você escrever o código a seguir, ofunc foo(_ s1: String) { // your code }
Xcode forneceria um aviso, mas há muitos códigos comofunc bringSubviewToFront(_ view: UIView)
na referência, por que?_
primeiro parâmetro é estranho. Posso supor que os designers pensam que obviamente é suficiente para o seu código e não melhora a legibilidade, pelo contrário, suja o código. Então você recebe o aviso. A referência tem o objetivo oposto: deve ser o mais claro possível - portanto, o sublinhado do primeiro parâmetro é mencionado para TODOS os métodos. Isso explicaria tudo)-
antes do primeiro parâmetro não é mais estranho. Por exemplo:override func viewWillAppear(_ animated: Bool)
sinais de que o chamador (código Objective-C) não estará usando um rótulo de parâmetroO sublinhado é um token geral usado para indicar um valor descartado.
Nesse caso específico, significa que a função será chamada como em
runAction(argument)
vez derunAction(action:argument)
Em outros contextos, tem outro significado semelhante, por exemplo:
Isso significa que queremos apenas executar o bloco 5 vezes e não nos importamos com o índice dentro do bloco.
Neste contexto:
Isso significa que não nos importamos com o que é o segundo elemento da tupla, apenas o primeiro.
fonte
let pi = 3.141_592_653_59
let pi = 3.1_4_15_92___63
Desde o Swift 3, todos os rótulos de argumentos são obrigatórios por padrão .
Você pode forçar um IDE a ocultar um rótulo de argumento
_
.chamado
foo(a: "abc")
efoo2("abc")
Por que a Apple está usando?
Você pode ver que a Apple está usando-o na API. As bibliotecas da Apple ainda são escritas em Objective-C (caso contrário, elas compartilham os mesmos nomes de função, que foram projetados para a sintaxe Objective-C)
Funções como
applicationWillResignActive(_ application: UIApplication)
teriam um nome de parâmetro redundanteapplication
, pois já existe o aplicativo em seu nome de função.Seu exemplo
func runAction(_ action: SKAction!)
seria chamado sem sua_
marca comorunAction(action:)
. O nome do parâmetroaction
seria redundante, pois já existe um no nome da função. Esse é o propósito e por que está lá.fonte
Um identificador na frente da declaração de parâmetro define um nome de parâmetro externo . Este é o nome que deve ser fornecido pelo chamador ao chamar a função:
Swift fornece um nome externo automático para qualquer parâmetro padrão definido, se você não fornecer um nome externo. O uso de um sublinhado para o nome do parâmetro externo opta por esse comportamento:
Você pode ler mais sobre esse comportamento na seção Nomes externos para parâmetros com valores padrão aqui .
fonte
SK
os designers não querem que você escrevaaction
duas vezes, porque "action" já faz parte do nome da função. Em outras palavras, eles não querem que você escrevasprite.runAction(action:moveGroundSpritesForever)
. O objetivo dos nomes de parâmetros externos era tornar seu código "lido como uma frase"; o usoaction
duas vezes derrotaria o objetivo disso.foo.bar(param: 'fiddle')
efoo.bar('fiddle')
NOTA: com apenas um argumento, ele realmente não se torna aparente ... mas com vários argumentos, torna-se muito relevante:foo.bar(param1: 'fiddle', param2: 'dee')
vsfoo.bar('fiddle','dee')
Eu acho que isso força uma convenção em Swift que a torna mais próxima do objetivo-c, que combina melhor com as convenções de cacau. Em objc, você não (externamente) nomeia seu primeiro parâmetro. Em vez disso, por convenção, você geralmente inclui o nome externo na última parte do nome do método, assim:
Para tornar as chamadas api do Swift consistentes com objc, você deseja suprimir o nome do parâmetro externo do primeiro parâmetro.
fonte
Na verdade, há uma diferença entre o código real usado para definir um método e a declaração do método nos documentos da Apple. Vamos dar UIControl 's - addTarget: ação: forControlEvents: método, por exemplo, o código real é:
Mas, nos documentos, ele aparece assim (observe _ antes do destino):
No código real, _ é usado para fazer com que o nome externo do segundo parâmetro ou subseqüente não apareça quando um método é chamado, enquanto nos documentos, _ antes do nome local de um parâmetro indica que, quando você chama um método ou uma função, não deve fornecer um nome externo.
Não há nome externo quando uma função é chamada por padrão, a menos que você forneça seu próprio nome ou adicione # antes (sem espaço em branco) do nome local de um parâmetro, por exemplo, é assim que usamos o dispatch_after :
E nos documentos, aparece assim (observe três _):
A convenção da declaração da função é exatamente a mesma que descrevi para o método.
fonte
Apenas mais visualmente.
Como você pode ver,
_
basta fazer omitir um nome de parâmetro local ou não.fonte