Quel est le représentant du soulignement dans les références Swift?

Dans la section de référence des documents d’Apple, il y a beaucoup d’instances de ce genre de choses:

func runAction(_ action : SKAction!)

L’Objective-C ‘équivalent’ de ceci est:

- (void)runAction:(SKAction *) action

Il me semble que c’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 tente 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 dont je parle dans cette référence à l’utilisation du 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 parameters de fonction / méthode et les étiquettes d’arguments 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 _underscores dans des fonctions qui clarifient une grande partie de cette question, ici: Pourquoi ai-je besoin de traits de soulignement dans swift?

    Les deux réponses étaient correctes mais je veux clarifier un peu plus.

    _ est utilisé pour modifier le comportement du nom de paramètre externe pour les méthodes .

    Dans la section Noms de parameters locaux et externes pour les méthodes de la documentation, il est indiqué:

    Swift atsortingbue au nom du premier paramètre dans une méthode un nom de paramètre local par défaut, et atsortingbue par défaut les noms de paramètre suivants et les noms de parameters locaux et externes .

    Par contre, les fonctions par défaut n’ont pas de noms de parameters externes.

    Par exemple, nous avons cette méthode foo() définie dans la classe Bar :

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

    Lorsque vous appelez foo() , il s’appelle bar.foo("Hello", s2: "World") .

    Mais , vous pouvez remplacer ce comportement en utilisant _ devant s2 où il est déclaré.

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

    Ensuite, lorsque vous appelez foo , il peut être simplement appelé bar.foo("Hello", "World") sans le nom du second paramètre.

    Retour à votre cas, runAction est une méthode car elle est évidemment associée au type SKNode . Ainsi, placer un paramètre avant l’ action permet d’appeler runAction 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 maintenant appelées en utilisant le nom de paramètre externe par défaut, en commençant au 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, exactement comme vous le feriez pour une méthode .

    Le trait de soulignement est un jeton général utilisé pour indiquer une valeur ignorée.

    Dans ce cas spécifique, cela signifie que la fonction sera appelée en tant que runAction(argument) au lieu de runAction(action:argument)

    Dans d’autres contextes, il a un autre sens similaire, par exemple dans:

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

    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:

     let (result, _) = someFunctionThatReturnsATuple() 

    Cela signifie que nous ne nous soucions pas de ce que le deuxième élément du tuple est, seulement le premier.

    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:

     func someFunction(externalParameterName localParameterName: Int) 

    Swift fournit un nom externe automatique pour tout paramètre défini par défaut, 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 désactiver ce comportement en écrivant un trait de soulignement ( _ ) au lieu d’un nom externe explicite lorsque vous définissez le paramètre.

    Vous pouvez en savoir plus sur ce comportement dans la section Noms externes pour les parameters avec des valeurs par défaut ici .

    Depuis Swift 3, tous les libellés d’argument sont requirejs par défaut .

    Vous pouvez forcer un IDE à masquer un libellé d’argument avec _ .

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

    appelé foo(a: "abc") et foo2("abc")

    Remarque: Ceci ne peut être utilisé que si a est le libellé de l’argument (externe) et le nom de la variable (interne) en même temps. C’est équivalent – func foo(aa: Ssortingng) n’acceptera pas le _ .

    Pourquoi Apple l’utilise-t-il?

    Vous pouvez voir qu’Apple l’utilise à travers l’API. Les bibliothèques d’Apple sont toujours écrites en Objective-C (sinon, elles partagent les mêmes noms de fonctions, qui ont été conçus pour la syntaxe Objective-C)

    Fonctions comme applicationWillResignActive(_ application: UIApplication) aurait une application nom de paramètre redondante , car il y a déjà l’ application dans son nom de fonction.

    Votre exemple

    func runAction(_ action: SKAction!) serait appelé sans son _ mark comme runAction(action:) . L’ action nom du paramètre serait redondante car il en existe déjà un dans le nom de la fonction. C’est le but et pourquoi c’est là.

    Je pense que cela impose une convention dans Swift qui la rend plus proche de l’objective-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:

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

    Pour que les appels api Swift soient compatibles avec objc, vous devez supprimer le nom du paramètre externe du premier paramètre.

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

    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 les documents Apple. Prenons UIControl – addTarget: action: forControlEvents: méthode par exemple, le code réel est: entrer la description de l'image ici

    Mais dans docs, il apparaît comme ceci (remarque _ avant cible): entrer la description de l'image ici

    Dans le code réel, _ est utilisé pour que le nom externe du deuxième paramètre ou du paramètre suivant n’apparaisse pas lors de l’appel d’une méthode, tandis que dans docs, _ avant le nom local d’un paramètre indique que lorsque vous appelez une méthode ou une fonction nom externe

    Il n’y a pas de nom externe lorsqu’une fonction est appelée par défaut à moins que vous fournissiez votre propre nom ou ajoutez # avant (sans espace) le nom local d’un paramètre, par exemple, voici comment nous utilisons dispatch_after : entrer la description de l'image ici

    Et dans docs, il apparaît comme ceci (remarquez trois _): entrer la description de l'image ici

    La convention de déclaration de fonction est la même que celle que j’ai décrite pour la méthode.

    Juste plus visuellement.

    entrer la description de l'image ici

    Comme vous pouvez le voir, faites simplement omettre un nom de paramètre local ou non.