W sekcji referencyjnej dokumentacji firmy Apple znajduje się wiele przykładów tego rodzaju rzeczy:
func runAction(_
action
: SKAction!)
`` Ekwiwalentem '' celu-C tego jest:
- (void)runAction:(SKAction *)
action
Uderza mnie, że prawdopodobnie ważne jest, aby (w odwołaniu do języka Swift) była spacja po podkreśleniu i napisie „akcja” kursywą.
Ale nie potrafię zrozumieć, co to próbuje przekazać. Może więc pytanie brzmi ... czy istnieje odniesienie do konwencji użytych w odniesieniach?
- oto strona, do której odwołuję się w tym odwołaniu do użycia podkreślenia: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction
Aktualizacja
Swift 3 wprowadził pewne zmiany w sposobie używania i nazywania nazw parametrów funkcji / metod oraz etykiet argumentów. Ma to konsekwencje dla tego pytania i odpowiedzi. @Rickster wykonuje niesamowitą robotę, odpowiadając na inne pytanie dotyczące _podstawowych wyników w funkcjach, które w większości wyjaśniają ten problem, tutaj: Dlaczego potrzebuję szybko podkreślenia?
źródło
Odpowiedzi:
Obie odpowiedzi były poprawne, ale chcę wyjaśnić trochę więcej.
_
służy do modyfikowania zachowania nazwy parametru zewnętrznego dla metod .W sekcji Lokalne i zewnętrzne nazwy parametrów dla metod w dokumentacji jest napisane:
Z drugiej strony funkcje domyślnie nie mają nazw parametrów zewnętrznych.
Na przykład mamy tę
foo()
metodę zdefiniowaną w klasieBar
:Kiedy dzwonisz
foo()
, nazywa się to jakbar.foo("Hello", s2: "World")
.Ale można to zmienić za pomocą
_
przeds2
gdzie jest zadeklarowana.Następnie, kiedy wywołujesz
foo
, może być po prostu wywołane jakbar.foo("Hello", "World")
bez nazwy drugiego parametru.Wracając do twojego przypadku,
runAction
to metoda, ponieważ jestSKNode
oczywiście związana z typem . Zatem umieszczenie_
parametru przedaction
pozwala na wywołanierunAction
bez nazwy zewnętrznej.Aktualizacja dla Swift 2.0
Funkcja i metoda działają teraz w ten sam sposób, jeśli chodzi o deklarację nazwy argumentu lokalnego i zewnętrznego.
Funkcje są teraz wywoływane domyślnie przy użyciu nazwy parametru zewnętrznego, począwszy od drugiego parametru. Ta zasada dotyczy tylko czystego kodu Swift.
Tak więc, dostarczając
_
przed funkcją funkcję , wywołujący nie będzie musiał określać nazwy parametru zewnętrznego, tak jak zrobiłbyś to dla metody .źródło
_
napiszesz przed drugim parametrem, twoja odpowiedź jest wystarczająco jasna; co jeśli wfunc runAction(_action: SKAction!)
,_
jest przed pierwszym parametrem lub jeśli napiszesz następujący kod,func foo(_ s1: String) { // your code }
Xcode dałoby ostrzeżenie, ale jest dużo kodu, jakfunc bringSubviewToFront(_ view: UIView)
w referencji, dlaczego?_
pierwszego parametru jest obce. Mogę założyć, że projektanci uważają, że jest to oczywiście wystarczające dla twojego kodu i nie poprawia czytelności, wręcz przeciwnie, brudzi kod. Więc dostajesz ostrzeżenie. Odniesienie ma odwrotny cel: musi być tak jasne, jak to tylko możliwe - dlatego podkreślenie pierwszego parametru jest wspomniane dla KAŻDEJ metody. To by wszystko wyjaśniało)-
przed pierwszym parametrem nie jest już zbędny. Na przykład:override func viewWillAppear(_ animated: Bool)
sygnalizuje, że dzwoniący (kod Objective-C) nie będzie używał etykiety parametruPodkreślenie to ogólny token używany do wskazania odrzuconej wartości.
W tym konkretnym przypadku oznacza to, że funkcja zostanie wywołana jako
runAction(argument)
zamiastrunAction(action:argument)
W innych kontekstach ma inne podobne znaczenie, np. W:
Oznacza to, że chcemy po prostu wykonać blok 5 razy i nie obchodzi nas indeks w bloku.
W tym kontekście:
Oznacza to, że nie obchodzi nas, jaki jest drugi element krotki, tylko pierwszy.
źródło
let pi = 3.141_592_653_59
let pi = 3.1_4_15_92___63
Od wersji Swift 3 wszystkie etykiety argumentów są domyślnie wymagane .
Możesz wymusić na IDE ukrycie etykiety argumentu za pomocą
_
.zadzwonił
foo(a: "abc")
ifoo2("abc")
Dlaczego Apple go używa?
Możesz zobaczyć, że Apple używa go w całym interfejsie API. Biblioteki Apple są nadal napisane w Objective-C (jeśli nie, i tak mają te same nazwy funkcji, które zostały zaprojektowane dla składni Objective-C)
Funkcje takie jak
applicationWillResignActive(_ application: UIApplication)
miałyby redundantną nazwę parametruapplication
, ponieważ w ich nazwie jest już aplikacja .Twój przykład
func runAction(_ action: SKAction!)
byłby nazywany bez swojego_
znakurunAction(action:)
. Nazwa parametruaction
byłaby zbędna, ponieważ istnieje już w nazwie funkcji. To jest cel i dlaczego tam jest.źródło
Identyfikator przed deklaracją parametru definiuje nazwę parametru zewnętrznego . To jest nazwa, którą musi podać dzwoniący podczas wywoływania funkcji:
Swift zapewnia automatyczną nazwę zewnętrzną dla każdego zdefiniowanego parametru domyślnego, jeśli sam nie podasz nazwy zewnętrznej. Użycie podkreślenia dla nazwy parametru zewnętrznego wyklucza to zachowanie:
Możesz przeczytać więcej o tym zachowaniu w sekcji Nazwy zewnętrzne dla parametrów z wartościami domyślnymi tutaj .
źródło
SK
projektanci nie chcą, abyś pisałaction
dwa razy, ponieważ „akcja” jest już częścią nazwy funkcji. Innymi słowy, nie chcą, żebyś pisałsprite.runAction(action:moveGroundSpritesForever)
. Celem nazw parametrów zewnętrznych było sprawienie, aby twój kod "czytał jak zdanie";action
dwukrotne użycie zniweczyłoby cel tego.foo.bar(param: 'fiddle')
ifoo.bar('fiddle')
UWAGA: przy tylko jednym argumencie to naprawdę nie staje się oczywiste ... ale przy wielu argumentach staje się bardzo istotne:foo.bar(param1: 'fiddle', param2: 'dee')
vsfoo.bar('fiddle','dee')
Myślę, że wymusza to w Swifcie konwencję, która przybliża go do celu-c, co lepiej pasuje do konwencji kakaowych. W objc nie podajesz (zewnętrznie) nazwy swojego pierwszego parametru. Zamiast tego, zgodnie z konwencją, zwykle umieszcza się nazwę zewnętrzną w drugiej części nazwy metody w następujący sposób:
Aby wywołania Swift api były spójne z objc, będziesz chciał pominąć nazwę parametru zewnętrznego pierwszego parametru.
źródło
W rzeczywistości istnieje różnica między rzeczywistym kodem używanym do zdefiniowania metody a deklaracją metody w dokumentacji Apple. Weźmy UIControl „s - addTarget: Działanie: forControlEvents: Sposób na przykład, prawdziwy kod jest:
Ale w dokumentach wygląda to tak (uwaga _ przed celem):
W prawdziwym kodzie _ służy do tego, aby zewnętrzna nazwa drugiego lub kolejnego parametru nie pojawiała się po wywołaniu metody, podczas gdy w dokumentach _ przed lokalną nazwą parametru wskazuje, że kiedy wywołujesz metodę lub funkcję, nie powinieneś podawać nazwa zewnętrzna.
Nie ma nazwy zewnętrznej, gdy funkcja jest wywoływana domyślnie, chyba że podasz własną lub dodasz # przed (bez spacji) lokalną nazwę parametru, na przykład, tak używamy dispatch_after :
W dokumentach wygląda to tak (zwróć uwagę na trzy _):
Konwencja deklaracji funkcji jest taka sama, jak opisałem dla metody.
źródło
Tylko bardziej wizualnie.
Jak widać, po
_
prostu make pomija lokalną nazwę parametru lub nie.źródło