web-dev-qa-db-fra.com

Quel est le représentant _ underscore de in Swift Références?

Dans la section de référence de la documentation d'Apple, il existe de nombreuses instances de ce genre de chose:

func runAction(_action: SKAction!)

L'objectif 'équivalent' de ceci est:

- (void)runAction:(SKAction *)action

Cela me semble important qu'il soit 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 essaye de transmettre. Alors peut-être que la question est ... existe-t-il une référence pour les conventions utilisées dans les références?

- voici la page que je référence dans cette référence à l'utilisation du soulignement: https://developer.Apple.com/documentation/spritekit/sknode#//Apple_ref/occ/instm/SKNode/runAction =

Mise à jour

Swift 3 a apporté quelques modifications à la manière dont les noms de paramètre de fonction/méthode et les étiquettes d'argument sont utilisés et nommés. Cela a des conséquences sur cette question et sa réponse. @Rickster fait un travail incroyable en répondant à une question différente à propos des _underscores dans des fonctions qui éclaircit une bonne partie de cette question, ici: Pourquoi ai-je besoin de traits de soulignement dans Swift?

136
Confused

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

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

Dans la section Noms des paramètres locaux et externes pour les méthodes de la documentation, on lit:

Swift donne le premier nom de paramètre dans une méthode un nom de paramètre local par défaut et donne le deuxième nom et les noms de paramètre suivants les noms de paramètres locaux et externes par défaut.

D'autre part, les fonctions par défaut n'ont pas de noms de paramètres externes.

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

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

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

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

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

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

Pour revenir à votre cas, runAction est une méthode car elle est associée au type SKNode, évidemment. Ainsi, placer un _ Avant le paramètre action vous permet d'appeler runAction sans nom externe.

Mise à jour pour Swift 2.0

La fonction et la méthode fonctionnent maintenant 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 par le 2e paramètre. Cette règle ne s'applique qu'au code pur Swift.

Donc, en fournissant un _ Devant une fonction , l'appelant n'aura pas à spécifier le nom du paramètre externe, comme quoi vous feriez pour une méthode .

108
Aaron He

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

Dans ce cas particulier, 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 une autre signification 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.

85
David Berry

Un identificateur 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 par défaut que vous définissez, si vous ne fournissez pas de nom externe vous-même. L'utilisation d'un trait de soulignement pour le nom du paramètre externe permet d'éviter 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.

Pour en savoir plus sur ce comportement, reportez-vous à la section Noms externes de paramètres avec valeurs par défaut ici .

13
dasblinkenlight

Depuis Swift tous les libellés d'argument sont obligatoires avant par défaut.

Vous pouvez forcer un IDE pour masquer une étiquette d'argument avec _.

func foo(a: String) {
}

func foo2(_ a: String) {
}

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

Remarque: Ceci ne peut être utilisé que lorsque a est le libellé de l'argument (externe) et (interne) nom de variable en même temps. C'est équivalent - func foo(a a: String) n'acceptera pas le _.

Pourquoi Apple l'utilise-t-il?

Vous pouvez voir 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, conçus pour la syntaxe Objective-C)

Des fonctions comme applicationWillResignActive(_ application: UIApplication) aurait redondant nom du paramètre application, car il existe déjà l'application dans son nom de fonction.

Votre exemple

func runAction(_ action: SKAction!) serait appelé sans c'est la marque _ comme runAction(action:). Le nom du paramètre action serait redondant puisqu'il en existe déjà un dans le nom de la fonction. C'est le but et pourquoi il est là.

11
Jakub Truhlář

Je pense que cela force une convention dans Swift qui la rend plus proche de l’objectif-c, qui correspond mieux aux conventions de cacao. Dans objc, vous ne nommez pas (en externe, votre premier paramètre). convention, vous incluez habituellement le nom externe dans la dernière partie du nom de la méthode, comme ceci:

- (void)myFancyMethodWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName;

[someInstance myFancyMethodWithFirstName:@"John" lastName:@"Doe"];

Pour effectuer des appels Swift api compatibles avec objc), vous voudrez supprimer le nom du paramètre externe du premier paramètre.

func myFancyMethodWithFirstName(_ firstName:String, lastName:String);

someInstance.myFancyMethodWithFirstName("John", lastName:"Doe")
10
smileBot

En réalité, il existe une différence entre le code réel utilisé pour définir une méthode et la déclaration de la méthode dans la documentation d'Apple. Prenons la méthode IControl addTarget: action: forControlEvents:, le code réel est: enter image description here

Mais dans la documentation, cela ressemble à ceci (notez _ avant la cible): enter image description here

Dans le code réel, _ est utilisé pour que le nom externe du deuxième paramètre ou des paramètres suivants n'apparaisse pas lorsqu'une méthode est appelée, tandis que dans la documentation, _ avant le nom local d'un paramètre indique que lorsque vous appelez une méthode ou une fonction, ne devrait 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 votre propre nom ou ajoutez # avant (sans espace) le nom local d'un paramètre, par exemple, voici comment nous utilisons dispatch_afterenter image description here

Et dans les documents, cela ressemble à ceci (notez trois _): enter image description here

La convention de déclaration de fonction est identique à celle décrite dans méthode.

5
fujianjin6471

Juste plus visuellement.

enter image description here

Comme vous pouvez voir le _ _ faites juste omettre un nom de paramètre local ou pas.

1
Nik Kov