Dans la section de référence de la documentation d'Apple, il y a beaucoup d'exemples de ce genre de chose:
func runAction(_
action
: SKAction!)
L'équivalent Objective-C de ceci est:
- (void)runAction:(SKAction *)
action
Il me semble qu'il est probablement important (dans la référence Swift) qu'il y ait un espace après le trait de soulignement et que «action» soit écrit en italique.
Mais je ne peux pas comprendre ce que cela essaie de transmettre. Alors peut-être que la question est ... y a-t-il une référence pour les conventions utilisées dans les références?
- voici la page que je fais référence dans cette référence à l'utilisation du trait de soulignement: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction
Mettre à jour
Swift 3 a apporté quelques modifications à la façon dont les noms de paramètres de fonction / méthode et les étiquettes d'argument sont utilisés et nommés. Cela a des ramifications sur cette question et sa réponse. @Rickster fait un travail incroyable en répondant à une question différente sur les _underscores dans des fonctions qui efface une grande partie de cela, ici: Pourquoi ai-je besoin de soulignements dans Swift?
la source
Réponses:
Les deux réponses étaient correctes, mais je veux clarifier un peu plus.
_
est utilisé pour modifier le comportement des noms de paramètres externes pour les méthodes .Dans la section Noms de paramètres locaux et externes pour les méthodes de la documentation, il est dit:
En revanche, les fonctions par défaut n'ont pas de noms de paramètres externes.
Par exemple, nous avons cette
foo()
méthode définie dans la classeBar
:Lorsque vous appelez
foo()
, il est appelé commebar.foo("Hello", s2: "World")
.Mais vous pouvez remplacer ce comportement en utilisant
_
devant l's2
endroit où il est déclaré.Ensuite, lorsque vous appelez
foo
, il pourrait être simplement appelé commebar.foo("Hello", "World")
sans le nom du deuxième paramètre.Revenons à votre cas,
runAction
c'est une méthode parce qu'elle est associée au typeSKNode
, évidemment. Ainsi, mettre un_
paramètre avantaction
vous permet d'appelerrunAction
sans nom externe.Mise à jour pour Swift 2.0
La fonction et la méthode fonctionnent désormais de la même manière en termes de déclaration de nom d'argument local et externe.
Les fonctions sont désormais appelées en utilisant le nom du paramètre externe par défaut, à partir du 2ème paramètre. Cette règle s'applique uniquement au code Swift pur.
Ainsi, en fournissant un
_
devant une fonction , l'appelant n'aura pas à spécifier le nom du paramètre externe, tout comme ce que vous feriez pour une méthode .la source
_
écriture avant le deuxième paramètre, votre réponse est assez clairement; et si dansfunc runAction(_action: SKAction!)
, le_
est avant le premier paramètre ou si vous écrivez le code suivantfunc foo(_ s1: String) { // your code }
Xcode vous donnerait un avertissement, mais il y a beaucoup de code commefunc bringSubviewToFront(_ view: UIView)
dans la référence, pourquoi?_
pour le premier paramètre est étrangère. Je peux supposer que les concepteurs pensent que c'est évidemment suffisant pour votre code et n'améliore pas la lisibilité, bien au contraire, cela salit le code. Alors vous recevez l'avertissement. La référence a le but opposé: elle doit être aussi claire que possible - donc le trait de soulignement du premier paramètre est mentionné pour CHAQUE méthode. Cela expliquerait tout)-
avant le premier paramètre n'est plus étranger. Par exemple:override func viewWillAppear(_ animated: Bool)
signale que l'appelant (code Objective-C) n'utilisera pas d'étiquette de paramètreLe trait de soulignement est un jeton général utilisé pour indiquer une valeur ignorée.
Dans ce cas précis, cela signifie que la fonction sera invoquée au
runAction(argument)
lieu derunAction(action:argument)
Dans d'autres contextes, il a une autre signification similaire, par exemple dans:
Cela signifie que nous voulons simplement exécuter le bloc 5 fois et que nous ne nous soucions pas de l'index dans le bloc.
Dans ce contexte:
Cela signifie que nous ne nous soucions pas de ce qu'est le deuxième élément du tuple, seulement le premier.
la source
let pi = 3.141_592_653_59
let pi = 3.1_4_15_92___63
Depuis Swift 3, toutes les étiquettes d'argument sont requises par défaut .
Vous pouvez forcer un IDE à masquer une étiquette d'argument avec
_
.appelé
foo(a: "abc")
etfoo2("abc")
Pourquoi Apple l'utilise-t-il?
Vous pouvez voir qu'Apple l'utilise dans l'API. Les bibliothèques d'Apple sont toujours écrites en Objective-C (sinon, elles partagent de toute façon les mêmes noms de fonction, qui ont été conçus pour la syntaxe Objective-C)
Des fonctions comme
applicationWillResignActive(_ application: UIApplication)
auraient un nom de paramètre redondantapplication
, car il y a déjà l' application dans son nom de fonction.Votre exemple
func runAction(_ action: SKAction!)
serait appelé sans sa_
marque commerunAction(action:)
. Le nom du paramètreaction
serait redondant car il y en a déjà un dans le nom de la fonction. C'est le but et pourquoi il est là.la source
Un identifiant devant la déclaration de paramètre définit un nom de paramètre externe . C'est le nom qui doit être fourni par l'appelant lors de l'appel de la fonction:
Swift fournit un nom externe automatique pour tout paramètre par défaut que vous définissez, si vous ne fournissez pas vous-même un nom externe. L'utilisation d'un trait de soulignement pour le nom du paramètre externe exclut ce comportement:
Vous pouvez en savoir plus sur ce comportement dans la section sur les noms externes pour les paramètres avec des valeurs par défaut ici .
la source
SK
les concepteurs ne veulent pas que vous écriviezaction
deux fois, car "action" fait déjà partie du nom de la fonction. En d'autres termes, ils ne veulent pas que vous écriviezsprite.runAction(action:moveGroundSpritesForever)
. Le but des noms de paramètres externes était de rendre votre code "lu comme une phrase"; utiliseraction
deux fois irait à l'encontre du but de cela.foo.bar(param: 'fiddle')
etfoo.bar('fiddle')
REMARQUE: avec un seul argument, cela ne devient vraiment pas apparent ... mais avec plusieurs arguments, cela devient très pertinent:foo.bar(param1: 'fiddle', param2: 'dee')
vsfoo.bar('fiddle','dee')
Je pense que cela force une convention dans Swift qui la rend plus proche de l'objectif-c, qui correspond mieux aux conventions du cacao. Dans objc, vous ne nommez pas (en externe) votre premier paramètre. Au lieu de cela, par convention, vous incluez généralement le nom externe dans la dernière partie du nom de la méthode comme ceci:
Pour rendre les appels d'API Swift cohérents avec objc, vous souhaiterez supprimer le nom de paramètre externe du premier paramètre.
la source
En fait, il existe une différence entre le code réel utilisé pour définir une méthode et la déclaration de méthode dans la documentation d'Apple. Prenons UIControl de - addTarget: action: forControlEvents: méthode par exemple, le code est réel:
Mais dans la documentation, cela ressemble à ceci (remarquez _ avant la cible):
Dans le code réel, _ est utilisé pour que le nom externe du deuxième paramètre ou des suivants n'apparaisse pas lorsqu'une méthode est appelée, tandis que dans la documentation, _ avant que le nom local d'un paramètre indique que lorsque vous appelez une méthode ou une fonction, vous ne devez pas fournir de nom externe.
Il n'y a pas de nom externe lorsqu'une fonction est appelée par défaut, sauf si vous fournissez le vôtre ou ajoutez le # avant (sans espace) le nom local d'un paramètre, par exemple, voici comment nous utilisons dispatch_after :
Et dans la documentation, cela ressemble à ceci (notez trois _):
La convention de déclaration de fonction est exactement la même que celle que j'ai décrite pour method.
la source
Juste plus visuellement.
Comme vous pouvez le voir,
_
faites simplement omettre un nom de paramètre local ou non.la source