Im Referenzabschnitt der Apple-Dokumente finden Sie viele Beispiele für solche Dinge:
func runAction(_
action
: SKAction!)
Das Objective-C-Äquivalent dazu ist:
- (void)runAction:(SKAction *)
action
Es fällt mir auf, dass es wahrscheinlich wichtig ist, dass (in der Swift-Referenz) nach dem Unterstrich ein Leerzeichen steht und "Aktion" kursiv geschrieben ist.
Aber ich kann nicht herausfinden, was dies zu vermitteln versucht. Vielleicht ist die Frage ... gibt es eine Referenz für die Konventionen, die in den Referenzen verwendet werden?
- Hier ist die Seite, auf die ich in diesem Verweis auf die Verwendung des Unterstrichs verweise: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction
Aktualisieren
Swift 3 hat einige Änderungen an der Verwendung und Benennung von Funktions- / Methodenparameternamen und Argumentbezeichnungen vorgenommen. Dies hat Konsequenzen für diese Frage und ihre Antwort. @Rickster beantwortet auf erstaunliche Weise eine andere Frage zu _underscores in Funktionen, die viel davon klären. Hier: Warum brauche ich schnell Unterstriche?
quelle
Antworten:
Beide Antworten waren richtig, aber ich möchte etwas mehr klarstellen.
_
wird verwendet, um das Verhalten externer Parameternamen für Methoden zu ändern .Im Abschnitt Lokale und externe Parameternamen für Methoden der Dokumentation heißt es:
Andererseits haben Funktionen standardmäßig keine externen Parameternamen.
Zum Beispiel haben wir diese
foo()
Methode in der Klasse definiertBar
:Wenn Sie anrufen
foo()
, heißt es wiebar.foo("Hello", s2: "World")
.Aber , können Sie dieses Verhalten außer Kraft setzen , indem Sie
_
vor ,s2
wo es erklärt.Wenn Sie dann aufrufen
foo
, kann es einfach wiebar.foo("Hello", "World")
ohne den Namen des zweiten Parameters aufgerufen werden.Zurück zu Ihrem Fall,
runAction
ist eine Methode, weil sieSKNode
offensichtlich mit dem Typ verbunden ist. Wenn Sie also einen_
before-Parameteraction
eingeben, können SierunAction
ohne externen Namen aufrufen .Update für Swift 2.0
Funktion und Methode funktionieren jetzt in Bezug auf die Deklaration lokaler und externer Argumentnamen auf dieselbe Weise .
Funktionen werden jetzt standardmäßig mit einem externen Parameternamen aufgerufen, beginnend mit dem 2. Parameter. Diese Regel gilt nur für reinen Swift-Code.
Wenn Sie also
_
eine Funktion vor einer Funktion bereitstellen , muss der Aufrufer keinen externen Parameternamen angeben, wie Sie es für eine Methode tun würden .quelle
_
vor dem zweiten Parameter schreiben, ist Ihre Antwort eindeutig genug; Was ist, wenn infunc runAction(_action: SKAction!)
, das_
vor dem ersten Parameter steht oder wenn Sie den folgenden Code schreiben ?func foo(_ s1: String) { // your code }
Xcode würde Ihnen eine Warnung geben, aber es gibt viel Code wiefunc bringSubviewToFront(_ view: UIView)
in der Referenz, warum?_
für den ersten Parameter irrelevant ist. Ich kann davon ausgehen, dass die Designer der Meinung sind, dass dies offensichtlich für Ihren Code ausreicht und die Lesbarkeit nicht verbessert, im Gegenteil, es verschmutzt den Code. Sie erhalten also die Warnung. Die Referenz hat das entgegengesetzte Ziel: Sie muss so klar wie möglich sein - daher wird der Unterstrich des ersten Parameters für JEDE Methode erwähnt. Das würde alles erklären)-
vor dem ersten Parameter ist also nicht mehr irrelevant. Zum Beispiel:override func viewWillAppear(_ animated: Bool)
signalisiert, dass der Anrufer (Objective-C-Code) keine Parameterbezeichnung verwendetDer Unterstrich ist ein allgemeines Token, mit dem ein verworfener Wert angegeben wird.
In diesem speziellen Fall bedeutet dies, dass die Funktion als
runAction(argument)
statt aufgerufen wirdrunAction(action:argument)
In anderen Zusammenhängen hat es eine andere ähnliche Bedeutung, z. B.:
Dies bedeutet, dass wir den Block lediglich fünfmal ausführen möchten und uns nicht um den Index innerhalb des Blocks kümmern.
In diesem Kontext:
Es bedeutet, dass es uns egal ist, was das zweite Element des Tupels ist, nur das erste.
quelle
let pi = 3.141_592_653_59
let pi = 3.1_4_15_92___63
Seit Swift 3 sind standardmäßig alle Argumentbezeichnungen erforderlich .
Sie können eine IDE zwingen, eine Argumentbezeichnung mit auszublenden
_
.genannt
foo(a: "abc")
undfoo2("abc")
Warum verwendet Apple es?
Sie können sehen, dass Apple es über die API verwendet. Apples Bibliotheken sind immer noch in Objective-C geschrieben (wenn nicht, haben sie ohnehin dieselben Funktionsnamen, die für die Objective-C-Syntax entwickelt wurden).
Funktionen wie
applicationWillResignActive(_ application: UIApplication)
hätten einen redundanten Parameternamenapplication
, da die Anwendung bereits im Funktionsnamen enthalten ist.Dein Beispiel
func runAction(_ action: SKAction!)
würde aufgerufen werden , ohne es der_
Marke wierunAction(action:)
. Der Parameternameaction
wäre redundant, da der Funktionsname bereits einen enthält. Das ist der Zweck und warum es da ist.quelle
Ein Bezeichner vor der Parameterdeklaration definiert einen externen Parameternamen. Dies ist der Name, den der Aufrufer beim Aufrufen der Funktion angeben muss:
Swift stellt einen automatischen externen Namen für jeden von Ihnen definierten Standardparameter bereit, wenn Sie selbst keinen externen Namen angeben. Wenn Sie einen Unterstrich für den externen Parameternamen verwenden, wird dieses Verhalten nicht berücksichtigt:
Weitere Informationen zu diesem Verhalten finden Sie im Abschnitt Externe Namen für Parameter mit Standardwerten hier .
quelle
SK
die Designer nicht möchten, dass Sieaction
zweimal schreiben , da "Aktion" bereits Teil des Funktionsnamens ist. Mit anderen Worten, sie wollen nicht, dass du schreibstsprite.runAction(action:moveGroundSpritesForever)
. Der Zweck externer Parameternamen bestand darin, Ihren Code "wie einen Satz lesen" zu lassen.action
zweimaliges Verwenden würde den Zweck davon zunichte machen.foo.bar(param: 'fiddle')
undfoo.bar('fiddle')
wechseln können. HINWEIS: Mit nur einem Argument wird es wirklich nicht offensichtlich ... aber mit mehreren Argumenten wird es sehr relevant:foo.bar(param1: 'fiddle', param2: 'dee')
vs.foo.bar('fiddle','dee')
Ich denke, dies erzwingt eine Konvention in Swift, die es näher an Ziel-c bringt, was besser zu Kakaokonventionen passt. In objc benennen Sie Ihren ersten Parameter nicht (extern). Stattdessen fügen Sie gemäß Konvention normalerweise den externen Namen wie folgt in den letzten Teil des Methodennamens ein:
Um Swift-API-Aufrufe mit objc konsistent zu machen, sollten Sie den externen Parameternamen des ersten Parameters unterdrücken.
quelle
Tatsächlich gibt es einen Unterschied zwischen dem tatsächlichen Code, der zum Definieren einer Methode verwendet wird, und der Methodendeklaration in Apples Dokumenten. Nehmen wir UIControl ‚s - addTarget: Aktion: forControlEvents: Verfahren zum Beispiel die echten Code ist:
In Dokumenten sieht es jedoch so aus (Hinweis _ vor dem Ziel):
Im realen Code wird _ verwendet, um den externen Namen des zweiten oder nachfolgenden Parameters beim Aufrufen einer Methode nicht anzuzeigen , während in docs _ vor dem lokalen Namen eines Parameters angegeben wird, dass Sie beim Aufrufen einer Methode oder einer Funktion keine angeben sollten externer Name.
Es gibt keinen externen Namen, wenn eine Funktion standardmäßig aufgerufen wird, es sei denn, Sie geben Ihren eigenen Namen an oder fügen # vor (ohne Leerzeichen) dem lokalen Namen eines Parameters hinzu. So verwenden wir beispielsweise dispatch_after :
Und in Dokumenten sieht es so aus (beachten Sie drei _):
Die Konvention der Funktionsdeklaration ist genau die gleiche, die ich für die Methode beschrieben habe.
quelle
Nur optisch.
Wie Sie sehen können, lassen Sie
_
einfach einen lokalen Parameternamen weg oder nicht.quelle